从pd数据框到Excel的层次结构索引,需要向前填充和取消合并

时间:2019-01-03 09:45:42

标签: python excel pandas datetime

我有一个具有三级层次结构索引的熊猫数据框,该索引由以下内容创建: df_grouped = df.groupby(['Country','Description', pd.Grouper(freq = 'M')]).sum()

基本上,是一个表格,其中“国家”是最高级别,“描述”是第二级别,然后是按月分组的日期。

图A

Here is a sample after exporting to excel:

我想做两件无关的事情:

在python中取消合并此结构中的所有层次结构索引,然后向前填充以创建图片B。

图片B

enter image description here

能够在PICTURE A的层次结构中将日期时间转换为python中的YYYY-MM,因此当导出它时,我得到了PICTUREC。(我知道我可以从PICTURE B中的结构中做到这一点,希望能够在熊猫数据框的层次结构中仍能做到这一点。

图片C

enter image description here

有什么提示吗?

1 个答案:

答案 0 :(得分:1)

groupby之后,您会得到MultiIndex DataFrame,因此值会在第一级和第二级中重新出现,只是不会显示。

如果不需要第二个DataFrame,则可以将strftimeDatetimeIndex转换为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