【问题标题】:pandas groupby conditional row sumpandas groupby 条件行总和
【发布时间】:2019-08-11 11:39:13
【问题描述】:

我有一个如下的数据框:

df = pd.DataFrame({'col_1': [2,2,2,3,3,3,3],
                   'col_2': [1,2,3,1,2,3,4],
                   'col_3':['A','A','A','B','B','B','B']})
   col_1  col_2 col_3
0      2      1     A
1      2      2     A
2      2      3     A
3      3      1     B
4      3      2     B
5      3      3     B
6      3      4     B

我想将col_2 与col_1 >= col_2 相加。

期望的输出应该是:

   col_1  col_2 col_3  col_4
0      2      1     A      3
1      2      2     A      3
2      2      3     A      3
3      3      1     B      6
4      3      2     B      6
5      3      3     B      6
6      3      4     B      6

我来了:

df.groupby(['col_3']).apply(lambda x: x.loc[x['col_1'] >= x['col_2']]['col_2'].sum())

但是,当数据变大(数百万行)时,这会非常慢,有没有更有效的方法?

【问题讨论】:

  • 感谢您的快速回复,我希望结果是在组级别,这样我可以方便地在组内保存 col_4 的值。但您的评论在某种意义上确实启发了对于这项特定任务,我可以简单地放弃不符合标准的观察并计算每组的观察数量,我认为这可能比当前更节省时间。无论如何,一般来说,最好为此类任务提供更有效的解决方案。有什么想法吗?

标签: python pandas apply pandas-groupby


【解决方案1】:

提前做条件数学。

In [46]: df = pd.DataFrame({'col_1': [2,2,2,3,3,3,3],
       :                    'col_2': [1,2,3,1,2,3,4],
       :                    'col_3':['A','A','A','B','B','B','B']})

In [47]: df['cond_val'] = (df.col_1 >= df.col_2) * df.col_2

In [48]: df
Out[48]:
   col_1  col_2 col_3  cond_val
0      2      1     A         1
1      2      2     A         2
2      2      3     A         0
3      3      1     B         1
4      3      2     B         2
5      3      3     B         3
6      3      4     B         0


In [50]: df.groupby('col_3').cond_val.sum()
Out[50]:
col_3
A    3
B    6
Name: cond_val, dtype: int64

【讨论】:

  • 这个在我的计时测试中最快(我尝试使用预选和合并总和系列的尝试慢了一倍)。
猜你喜欢
  • 2020-02-22
  • 2021-10-18
  • 1970-01-01
  • 2018-09-29
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
相关资源
最近更新 更多