Pandas группирует по нескольким столбцам со значениями уникальных группировок в качестве собственного столбца

#python #pandas #pandas-groupby

#python #pandas #pandas-groupby

Вопрос:

Пример фрейма данных =

 df = pd.DataFrame({'ID': [1,1,2,2,2,3,3,3],
...                'Type': ['b','b','b','a','a','a','a']})
  

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

 pd.DataFrame({'ID': [1,2,3],'Count_TypeA': [0,2,3], 'CountTypeB':[2,1,0]}, 'TotalCount':[2,3,3])
  

Есть ли простой способ сделать это с помощью функции groupby в pandas?

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

1. pd.crosstab(df['ID'],df['Type'], margins=True)

Ответ №1:

Для того, что вам нужно, вы можете использовать метод get_dummies из pandas . Это преобразует категориальную переменную в фиктивные / индикаторные переменные. Вы можете проверить ссылку здесь.

Проверьте, соответствует ли это вашим требованиям:

 import pandas as pd

df = pd.DataFrame({'ID': [1, 1, 2, 2, 2, 3, 3, 3],
                   'Type': ['b', 'b', 'b', 'a', 'a', 'a', 'a', 'a']})

dummy_var = pd.get_dummies(df["Type"])
dummy_var.rename(columns={'a': 'CountTypeA', 'b': 'CountTypeB'}, inplace=True)

df1 = pd.concat([df['ID'], dummy_var], axis=1)

df_group1 = df1.groupby(by=['ID'], as_index=False).sum()

df_group1['TotalCount'] = df_group1['CountTypeA']   df_group1['CountTypeB']
print(df_group1)
  

Это выведет следующий результат:

    ID  CountTypeA  CountTypeB  TotalCount
0   1           0           2           2
1   2           2           1           3
2   3           3           0           3