大熊猫中多列的逻辑与

时间:2019-01-12 05:11:20

标签: python python-3.x pandas numpy dataframe

我有一个如下所示的数据框(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()函数

3 个答案:

答案 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'] 提前进行适当的否定。