Логическое И нескольких столбцов в пандах - PullRequest
0 голосов
/ 12 января 2019

У меня есть фрейм данных (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

Этот код работает нормально, однако, если количество переменных в кадре данных увеличивается, то число условий быстро растет. Итак, есть ли умный способ написать условие, которое гласит, что если AND, в котором две (или более) переменные приводят к нулю, тогда выполнить функцию sum ()

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Вы можете сначала отфильтровать, используя 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
0 голосов
/ 12 января 2019

Используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...