【问题标题】:pandas groupby aggregate data across columnspandas groupby 跨列聚合数据
【发布时间】: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


【解决方案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]

【讨论】:

  • 感谢您的建议!我试过你的方法,但它返回所有行的平均值(时间索引) - 在这个例子中 - 七个值,而不是所有天的平均值?
  • 我不明白。但它不是给你所需的o / p吗?也许您可以使用反例来编辑帖子以清除问题。这将返回您按索引小时分组的所有列名的平均值。
  • 我刚刚编辑了我的帖子以包含您的方法:) 我错过了什么吗?
  • 它对我有用。你用的是什么版本的pandas/Python
  • 奇怪!我用的是anaconda python 2.7.12和pandas 0.16.2,还开启了pylab。
【解决方案2】:

另一种可能性:

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

【讨论】:

  • 这正是我想要的!太感谢了。我也尝试提取 groupby 对象中的数据。我不熟悉 for 循环中下划线的用法,有没有关于此的介绍性示例?它看起来很强大。
  • 下划线只是一个普通的变量名。有一个约定,将它用于以后不使用的“丢弃变量”。
  • NumPy 旨在提供矢量化。在迭代 for 循环时使用它的功能,当有其他方法可以执行手头的相同任务时,只会扼杀它的目的。
  • 我同意使用 groupby 可能比 Nickil 的解决方案慢很多。这是否具有实际影响取决于。此外,如果您以后想与小组一起做其他事情,清晰可能会超过速度。
猜你喜欢
  • 2021-11-01
  • 2019-10-12
  • 2017-07-02
  • 2017-07-20
  • 2023-03-07
  • 2019-12-22
  • 2016-05-24
  • 2013-02-06
  • 2014-11-23
相关资源
最近更新 更多