2017-01-17 3 views
1

я пытаюсь сделать GroupBy на id column таким образом, что я могу показать количество строк в col1, равное 1.питона панды GroupBy затем подсчет строк, удовлетворяющих условию

ДФ:

id col1 col2 col3 
a 1  1 1 
a 0  1 1 
a 1  1 1 
b 1  0 1 

мой код:

df.groupby(['id'])[col1].count()[1] 

выход я получил, было 2. Оно не показать мне значения из других ids как б.

я хочу:

id col1 
a 2  
b 1 

, если это возможно может общие строки на идентификатор также отображается в виде нового столбца?

пример:

id col1 total 
a 2 3 
b 1 1 

ответ

1

Если у вас есть только 1 и 0 в col1, вы можете использовать agg:

df.groupby('id', as_index=False)['col1'].agg({'col1': 'sum', 'total': 'count'}) 

# id total col1 
#0 a  3  2 
#1 b  1  1 
0

Это потому, что ваши строки, которые идентификатор «а» суммы на 3. 2 из них идентичны, поэтому это были сгруппированы и рассматриваться как один, то он добавляется уникальный строку, которая содержит значение 0 на его столбце 1. Вы не можете группировать строки с разными значениями в своих строках.

Да, вы можете добавить его на ваш выход. Просто разместите метод, как вы подсчитали все строки в разделе вашего столбца вашего кода.

0

Если вы хотите, чтобы обобщить решение включить значения в col1, которые не равны нулю вы можете сделать следующее. Это также правильно упорядочивает столбцы.

df.set_index('id')['col1'].eq(1).groupby(level=0).agg([('col1', 'sum'), ('total', 'count')]).reset_index() 

    id col1 total 
0 a 2.0  3 
1 b 1.0  1 

Используя кортеж в agg способе, в котором первое значение является именем столбца, а вторая функция агрегирования является новым для меня. Я просто экспериментировал и, похоже, работал. Я не помню, чтобы это было в документации, поэтому используйте с осторожностью.

Смежные вопросы