pandas groupby跨列聚合数据

时间:2017-01-23 08:54:02

标签: python pandas dataframe aggregate

我正在使用熊猫在一天(小时)的同一时间进行分组,然后在昼夜循环的所有日子中进行平均,换句话说,每小时应用多天均值。此外,我想平均不同来源的数据,例如。站点或国家。

具体来说,我的数据框 df 与pandas时间索引如下:

                     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]

2 个答案:

答案 0 :(得分:1)

这应该是一种更简单的方法:

1)使用.hour属性访问小时,并将其指定为新的索引轴。

2)堆叠DF,以便所有列都属于单个健康列。执行Groupby w.r.t小时标签(包含多索引的level=0)并计算平均值。

df.index = df.index.hour                 
df.stack().mean(level=0).tolist()  
Out[20]:
[15.25, 12.2, 10.5]

答案 1 :(得分:1)

另一种可能性:

diurnal = [np.nanmean(g) for _, g, in df.groupby(df.index.hour)]