在pandas DataFrame中使用groupby进行分组后,当列名重复时,如何更改列名?

3

我有一个数据框,有两列TimeStamp(日期类型)和Value。我想按年和小时进行聚合,并且Value是平均值。

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

结果如下:
                       Value
TimeStamp   TimeStamp
2014        0          4643.733325
            1          4278.877103
...

我希望将表头平铺,并将列重命名为“年份”,“小时”和“数值”。但由于“时间戳”这个名称是重复的,因此我无法使用.reset_index()。我尝试使用

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

但是时间戳列失去了所有的值。
        index      Value
0       0          4643.733325
1       1          4278.877103
...

如何获得

Year   Hour   Value
2014   1      4643.7
       2      4278.8
2个回答

4

使用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

或者通过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

1
我认为您可以这样做:

df.groupby([df["TimeStamp"].dt.year,
        df.rename(columns={"TimeStamp":"TimeStamp_1"})["TimeStamp_1"].dt.hour]).mean()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接