考虑以下示例:
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的潜力.
因此,例如,组栏和列B的预期输出将是
+10 (indeed C equals 5 and is >=0)
-4 (indeed C equals 0 and is >=0)
+5 = 11
另一个例子:
group foo和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
注意我使用NaN而不是零,因为如果我们要放零,则除了sum之外的其他函数会给出错误的结果(中位数).
换句话说,这是一个简单的条件求和,其中条件基于另一列.
谢谢!