我有一个具有三级层次结构索引的熊猫数据框,该索引由以下内容创建:
df_grouped = df.groupby(['Country','Description', pd.Grouper(freq = 'M')]).sum()
基本上,是一个表格,其中“国家”是最高级别,“描述”是第二级别,然后是按月分组的日期。
图A
我想做两件无关的事情:
在python中取消合并此结构中的所有层次结构索引,然后向前填充以创建图片B。
图片B
能够在PICTURE A的层次结构中将日期时间转换为python中的YYYY-MM,因此当导出它时,我得到了PICTUREC。(我知道我可以从PICTURE B中的结构中做到这一点,希望能够在熊猫数据框的层次结构中仍能做到这一点。
图片C
有什么提示吗?
答案 0 :(得分:1)
在groupby
之后,您会得到MultiIndex DataFrame
,因此值会在第一级和第二级中重新出现,只是不会显示。
如果不需要第二个DataFrame,则可以将strftime
的DatetimeIndex
转换为YYYY-MM
格式,或者将to_period
的月份转换为月周期:
df_grouped = df.groupby(['Country','Description', df.index.strftime('%Y-%m')]).sum()
或者:
df_grouped = df.groupby(['Country','Description', df.index.to_period('m')]).sum()
如果需要第二个DataFrame
,请添加reset_index
以将级别转换为列,并使用MultiIndex.set_levels
将第二级get_level_values
转换为:
df_grouped = df.groupby(['Country','Description', pd.Grouper(freq = 'M')]).sum()
df = df_grouped.reset_index()
idx = df_grouped.index.get_level_values(2).strftime('%Y-%m')
df_grouped.index = df_grouped.index.set_levels(idx, level=2)
示例:
rng = pd.date_range('2017-04-03', periods=10, freq='10D')
df = pd.DataFrame({'Country': ['Country'] * 10,
'Description':['A'] * 3 + ['B'] * 3 + ['C'] * 4,
'a': range(10)}, index=rng)
print (df)
Country Description a
2017-04-03 Country A 0
2017-04-13 Country A 1
2017-04-23 Country A 2
2017-05-03 Country B 3
2017-05-13 Country B 4
2017-05-23 Country B 5
2017-06-02 Country C 6
2017-06-12 Country C 7
2017-06-22 Country C 8
2017-07-02 Country C 9
df_grouped = df.groupby(['Country','Description', pd.Grouper(freq = 'M')]).sum()
print (df_grouped)
a
Country Description
Country A 2017-04-30 3
B 2017-05-31 12
C 2017-06-30 21
2017-07-31 9
df = df_grouped.reset_index().rename(columns={'level_2':'Date'})
print (df)
Country Description Date a
0 Country A 2017-04-30 3
1 Country B 2017-05-31 12
2 Country C 2017-06-30 21
3 Country C 2017-07-31 9
idx = df_grouped.index.get_level_values(2).strftime('%Y-%m')
df_grouped.index = df_grouped.index.set_levels(idx, level=2)
print (df_grouped)
a
Country Description
Country A 2017-04 3
B 2017-05 12
C 2017-06 21
2017-07 9