重新索引多索引数据框

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)

【讨论】:

以上是关于重新索引多索引数据框的主要内容,如果未能解决你的问题,请参考以下文章

排序多索引数据框保持索引排序

Pandas 多索引数据框 - 从多索引中的一个索引中选择最大值

熊猫数据框检查索引是不是存在于多索引中

如何使用单个索引更新多索引数据框中的记录

转换多索引数据框并按位置更改二级索引

如何更改多索引数据框中的索引