python - 在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
解决方案
使用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
推荐阅读
- r - 在 R 的数据框中有条件地创建一个新列(相当于 SAS 中的 if then 语句)
- python - 找出一个字典中的键是否存在于字典列表中
- mysql - 我不使用索引的最左边前缀,为什么索引在结果中有效?
- sql - 将 CSV 中的 SQL 日期时间转换为本地日期时间
- google-sheets - 谷歌表格查询返回奇怪的格式
- r - 如何在readr read_csv(list.files for loop)中组合路径和变量?
- c++ - 如何读取文件中每一行上由不同分隔符分隔的整数值?
- html - 网页在桌面上看起来不错,但在我的智能手机上却不行
- opc-ua - 如何使用 OPC UA 命名空间?
- r - 数据帧到fasta文件格式