重新索引多索引数据框
Posted
技术标签:
【中文标题】重新索引多索引数据框【英文标题】:Reindexing Multiindex dataframe 【发布时间】:2020-04-16 00:20:09 【问题描述】:我有 Multiindex 数据框,我想重新索引它。但是,我得到“重复轴错误”。
Product Date col1
A September 2019 5
October 2019 7
B September 2019 2
October 2019 4
我怎样才能实现这样的输出?
Product Date col1
A January 2019 0
February 2019 0
March 2019 0
April 2019 0
May 2019 0
June 2019 0
July 2019 0
August 2019 0
September 2019 5
October 2019 7
B January 2019 0
February 2019 0
March 2019 0
April 2019 0
May 2019 0
June 2019 0
July 2019 0
August 2019 0
September 2019 2
October 2019 4
首先我尝试了这个:
nested_df = nested_df.reindex(annual_date_range, level = 1, fill_value = 0)
其次,
nested_df = nested_df.reset_index().set_index('Date')
nested_df = nested_df.reindex(annual_date_range, fill_value = 0)
【问题讨论】:
【参考方案1】:您每个月都应该执行以下操作:
df.loc[('A', 'January 2019'), :] = (0)
df.loc[('B', 'January 2019'), :] = (0)
【讨论】:
我想过这样做,我猜,这不是一个最佳解决方案。还有其他解决办法吗?ValueError: cannot reindex from a duplicate axis
,这个错误阻止了我。
@JuniorESE 你能分享你出现错误的代码吗?
@JuniorESE 要优化此代码,您可以创建两个循环。第一个 for 循环通过 Products,第二个嵌套循环通过 Date。在这个循环的主体中将只有我上面提到的一行。【参考方案2】:
让df1
成为您的第一个具有非零值的数据框。方法是用零值创建另一个数据框df
,然后合并两个数据框以获得结果。
dates = ['month-2019'.format(month=month) for month in range(1,9)]*2
length = int(len(dates)/2)
products = ['A']*length + ['B']*length
Col1 = [0]*len(dates)
df = pd.DataFrame('Dates': dates, 'Products': products, 'Col1':Col1).set_index(['Products','Dates'])
现在 MultiIndex 被转换为日期时间:
df.index.set_levels(pd.to_datetime(df.index.get_level_values(1)[:8]).strftime('%m-%Y'), level=1,inplace=True)
在df1
中你必须做同样的事情,即将日期时间多索引级别更改为相同的格式:
df1.index.set_levels(pd.to_datetime(df1.index.get_level_values(1)[:2]).strftime('%m-%Y'), level=1,inplace=True)
我这样做是因为否则(例如,如果日期时间的格式类似于 %B %y
),按月份对 MultiIndex 进行排序会出错。现在合并两个数据框就足够了:
result = pd.concat([df1,df]).sort_values(['Products','Dates'])
最后一步是更改日期时间格式:
result.index.set_levels(levels = pd.to_datetime(result.index.get_level_values(1)[:10]).strftime('%B %Y'), level=1, inplace=True)
【讨论】:
以上是关于重新索引多索引数据框的主要内容,如果未能解决你的问题,请参考以下文章