我有一个如下所示的数据框(edata)
Domestic Catsize Type Count
1 0 1 1
1 1 1 8
1 0 2 11
0 1 3 14
1 1 4 21
0 1 4 31
从这个数据框中,我想计算所有变量的总和,其中两个变量(国内和猫大小)的逻辑与结果为零(0),从而使
1 0 0
0 1 0
0 0 0
我用来执行此过程的代码是
g=edata.groupby('Type')
q3=g.apply(lambda x:x[((x['Domestic']==0) & (x['Catsize']==0) |
(x['Domestic']==0) & (x['Catsize']==1) |
(x['Domestic']==1) & (x['Catsize']==0)
)]
['Count'].sum()
)
q3
Type
1 1
2 11
3 14
4 31
此代码可以正常工作,但是,如果数据框中的变量数量增加,则条件数量会迅速增长。那么,有没有一种聪明的方式来写一个条件,该条件指出如果两个(或多个)变量进行与运算,结果为零,则执行sum()函数
答案 0 :(得分:2)
使用np.logical_and.reduce
进行概括。
columns = ['Domestic', 'Catsize']
df[~np.logical_and.reduce(df[columns], axis=1)].groupby('Type')['Count'].sum()
Type
1 1
2 11
3 14
4 31
Name: Count, dtype: int64
在将其重新添加之前,请使用map
进行广播:
u = df[~np.logical_and.reduce(df[columns], axis=1)].groupby('Type')['Count'].sum()
df['NewCol'] = df.Type.map(u)
df
Domestic Catsize Type Count NewCol
0 1 0 1 1 1
1 1 1 1 8 1
2 1 0 2 11 11
3 0 1 3 14 14
4 1 1 4 21 31
5 0 1 4 31 31
答案 1 :(得分:2)
您可以先使用否定的pd.DataFrame.all
进行过滤:
cols = ['Domestic', 'Catsize']
res = df[~df[cols].all(1)].groupby('Type')['Count'].sum()
print(res)
# Type
# 1 1
# 2 11
# 3 14
# 4 31
# Name: Count, dtype: int64
答案 2 :(得分:0)
怎么样
EAX
然后随心所欲。
逻辑 AND 产品很好地完成了这个技巧。
对于逻辑 OR,您可以使用 columns = ['Domestic', 'Catsize']
df.loc[~df[columns].prod(axis=1).astype(bool), 'Count']
提前进行适当的否定。