【发布时间】:2017-06-07 17:22:13
【问题描述】:
我正在使用 pandas 对一天中的同一时间(小时)进行分组,然后在一个昼夜循环中对所有天进行平均,换句话说,对每个小时应用多天平均值。此外,我想对不同来源的数据进行平均,例如。车站或国家。
具体来说,我有一个带有熊猫时间索引的数据框 df,如下所示:
A B C
2010-01-02-07:00 10 22 30
2010-01-02-08:00 12 20 NaN
2010-01-03-07:00 11 8 15
2010-01-03-08:00 10 10 9
2010-01-03-09:00 11 13 18
2010-01-05-07:00 NaN 10 16
2010-01-05-09:00 14 0 7
按照这篇文章:Can pandas groupby aggregate into a list, rather than sum, mean, etc?,我可以通过提取同一小时的所有数据并将它们连接到一个列表中来实现我的目标。但我仍然想知道是否有更直接或更好的方法来做到这一点?
这里我显示我的代码如下:
df['hour'] = df.index.hour # create a new column for each time stamp
grp = df.groupby('hour').agg(lambda x: tuple(x)) # group by hour
result = grp[grp.columns[0]] # append all the columns
for col in grp.columns:
result = result + grp[col]
diurnal = [np.nanmean(np.array(result[hour])) for hour in grp.index] # average each tuple
这是输出:
Out:
[15.25, 12.2, 10.5]
非常感谢!
==========
我尝试了@Nickil 的方法:
data = {'A': [10, 12, 11, 10, 11, np.nan, 14], 'B': [22, 20, 8, 10, 13, 10, 0], 'C': [30, np.nan, 15, 9, 18, 16, 7]}
df = pd.DataFrame(data, index=[datetime.datetime(2010,1,2,7,0), datetime.datetime(2010,1,2,8,0), datetime.datetime(2010,1,3,7,0), datetime.datetime(2010,1,3,8,0), datetime.datetime(2010,1,3,9,0), datetime.datetime(2010,1,5,7,0), datetime.datetime(2010,1,5,9,0)])
df.index = df.index.hour
diurnal = df.stack().mean(level=0).tolist()
这是我得到的:
Out:
[20.666666666666668, 16.0, 11.333333333333334, 9.6666666666666661, 14.0, 13.0, 7.0]
【问题讨论】:
-
你在重复计算
result的第一列,对吧? -
@hvwaldow 哎呀...感谢您的指出!你是对的,它应该从 for 循环中的第二项开始。顺便说一句,我不太喜欢这种将所有列添加在一起的方式。有没有更好的办法?再次感谢!
标签: python pandas dataframe aggregate