Агрегирование столбчатых данных в фрейме данных Pandas

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть фрейм данных, как показано ниже:

 col1 = ['a','b','c','a','c','a','b','c','a']
col2 = [1,1,0,1,1,0,1,1,0]
df2 = pd.DataFrame(zip(col1,col2),columns=['name','count'])

    name    count
0   a       1
1   b       1
2   c       0
3   a       1
4   c       1
5   a       0
6   b       1
7   c       1
8   a       0
  

Я пытаюсь подсчитать количество 0 и 1, соответствующих каждому элементу в столбце «имя». Таким образом, ожидаемый результат будет выглядеть следующим образом:

 name  zero_count  one_count

a     2           2
b     0           2
c     1           2
  

До сих пор я пробовал много сценариев, и один, который выглядел многообещающим, был:

 ser = df2.groupby(['name','count']).size().to_frame().reset_index()
ser
    name    count  0
0   a       0      2
1   a       1      2
2   b       1      2
3   c       0      1
4   c       1      2
  

Что еще я могу попытаться исправить?

Ответ №1:

Попробуйте crosstab

 pd.crosstab(df2['name'], df2['count'])
Out[40]: 
count  0  1
name       
a      2  2
b      0  2
c      1  2
  

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

1. Спасибо. Немного подправив, я получил то, что хотел. test1 = pd.crosstab(df2['name'], df2['count']) затем test1.reset_index().rename(columns={'index': 'count'}).rename_axis(None, axis='columns')

Ответ №2:

Однострочный:

 In [982]: df2.groupby(['name','count']).size().reset_index().pivot('name', 'count')
Out[982]: 
         0     
count    0    1
name           
a      2.0  2.0
b      NaN  2.0
c      1.0  2.0
  

Пошаговое объяснение:

 In [950]: res = df2.groupby(['name','count']).size().reset_index(name='counts')

In [958]: out = res.pivot(index='name', columns='count', values='counts').fillna(0)

In [959]: out.columns = ['zero_count', 'one_count']

In [960]: out
Out[960]: 
      zero_count  one_count
name                       
a            2.0        2.0
b            0.0        2.0
c            1.0        2.0
  

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

1. И вам спасибо. Опять же, я применил разумный трюк, как указано выше, чтобы сбросить индекс и переименовать столбец.

Ответ №3:

 #count zeros:
df2.groupby(['name']).agg(lambda x: x.eq(0).sum())
#count ones:
df2.groupby(['name']).agg(lambda x: x.eq(1).sum())