首页 > 解决方案 > 在groupby之后更改pandas DataFrame的列名,标题中有重复的名称

问题描述

我有一个包含两列时间戳(日期类型)和值的数据框。我想按年和小时汇总,值是平均值。

df.groupby([df["TimeStamp"].dt.year,df["TimeStamp"].dt.hour]).mean()

结果是:

                       Value
TimeStamp   TimeStamp
2014        0          4643.733325
            1          4278.877103
...

我想展平标题并将列重命名为年、小时、值。但我不能使用.reset_index(),因为名称 TimeStamp 是重复的。我试着用

df.groupby([df["TimeStamp"].dt.year,df["TimeStamp"].dt.hour],as_index=False).mean().reset_index()

但是 TimeStamp 列丢失了所有值

        index      Value
0       0          4643.733325
1       1          4278.877103
...

我怎么能有

Year   Hour   Value
2014   1      4643.7
       2      4278.8

标签: pythonpandas

解决方案


使用rename

rng = pd.to_datetime(['2014-04-03', '2014-04-03 01:01:00', '2014-05-03'])
df = pd.DataFrame({'TimeStamp': rng, 'value': range(3)})  
print (df)
            TimeStamp  value
0 2014-04-03 00:00:00      0
1 2014-04-03 01:01:00      1
2 2014-05-03 00:00:00      2

s = df.groupby([df["TimeStamp"].dt.year.rename('Year'),
                df["TimeStamp"].dt.hour.rename('Hour')]).mean()
print (s)
           value
Year Hour       
2014 0         1
     1         1

或通过以下方式设置 MultiIndex 名称rename_axis

s = df.groupby([df["TimeStamp"].dt.year,
                df["TimeStamp"].dt.hour]).mean()

s = s.rename_axis(['Year','Hour'])
#another solution
#s.index.names = ['Year','Hour']
print (s)
           value
Year Hour       
2014 0         1
     1         1

推荐阅读