python: сгруппировать по 3 столбцам в соответствии с группировкой первых двух

#python #pandas #dataframe #pandas-groupby

#питон #панды #фрейм данных #панды-групповые

Вопрос:

Учитывая этот фрейм данных,

 import pandas as pd d = {'a': ['john', 'mary','john','john','mary','john'], 'b': [1,2,3,1,1,2],  'c': [0.7, 0.3,0.9,0.4,1.0,0.2],'d': [1,0,0,1,0,1]} df = pd.DataFrame(data=d)  

Следующая строка выводит, сколько раз df['a']=john и df['a']=mary соответствует df['b']=1,2,3

 print(df.groupby('a')['b'].value_counts())  

Что я хочу сделать сейчас, так это распечатать, сколько раз df['a']=john и df['a']=mary соответствует df['d']=1 или =0 когда df['b']=1,2,3 . например, когда df['a']=john и df['b']=1 , df['d'] всегда равно 1, а когда df['a']=john и df['b']=3 и df['d']=0 т. Д…

В следующей строке выводятся все нули, и я не уверен, почему:

 print((df['d'])[(df.groupby('a')['b'].value_counts())])  

Комментарии:

1. df.groupby('a')['b'].value_counts() возвращает ряд, содержащий только 2 и 1. df['d'][2] и df['d'][1] оба равны 0. Отсюда и все нули.

2. df.groupby(['a','b','c']).size()

Ответ №1:

Вы можете изменить свой код, чтобы разместить несколько столбцов в groupby :

 print(df.groupby(['a', 'b'])['d'].value_counts()) # a b d # john 1 1 2 # 2 1 1 # 3 0 1 # mary 1 0 1 # 2 0 1  

Ответ №2:

Просто сделай value_counts

 out = df.value_counts(['a','b','d']) a b d john 1 1 2  2 1 1  3 0 1 mary 1 0 1  2 0 1 dtype: int64