【发布时间】:2016-07-20 02:52:49
【问题描述】:
考虑以下示例:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B' : [12,10,-2,-4,-2,5,8,7],
'C' : [-5,5,-20,0,1,5,4,-4]})
df
Out[12]:
A B C
0 foo 12 -5
1 bar 10 5
2 foo -2 -20
3 bar -4 0
4 foo -2 1
5 bar 5 5
6 foo 8 4
7 foo 7 -4
这里我需要为A中的每个组计算B中的元素的总和 以C为非负为条件(即> = 0,基于另一列的条件)。 C 反之亦然。
但是,我下面的代码失败了。
df.groupby('A').agg({'B': lambda x: x[x.C>0].sum(),
'C': lambda x: x[x.B>0].sum()})
AttributeError: 'Series' object has no attribute 'B'
所以看来apply 是首选(因为应用看到我认为的所有数据框),但不幸的是我不能使用带有apply 的字典。所以我被困住了。有什么想法吗?
一个不太漂亮的不太高效的解决方案是在运行groupby 之前创建这些条件变量,但我确信这个解决方案不会利用Pandas.
因此,例如,bar 和 column B 组的预期输出将是
+10 (indeed C equals 5 and is >=0)
-4 (indeed C equals 0 and is >=0)
+5 = 11
另一个例子:
群组foo 和column B
NaN (indeed C equals -5 so I dont want to consider the 12 value in B)
+ NaN (indeed C= -20)
-2 (indeed C=1 so its positive)
+ 8
+NaN = 6
请注意,我使用 NaNs 而不是零,因为如果我们将零放在另一个函数而不是 sum 会给出错误的结果(中位数)。
换句话说,这是一个简单的条件求和,其中条件基于另一列。 谢谢!
【问题讨论】: