#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())