Панды Python вычисляют значения из двух столбцов и используют groupby

#python #pandas #group-by #count #apply

Вопрос:

У меня есть фрейм данных :

 data = {'label': ['cat','dog','dog','cat','cat'],  'breeds': [ 'bengal','shar pei','pug','maine coon','maine coon'],  'nicknames':[['Loki','Loki' ],['Max'],['Toby','Zeus ','Toby'],['Marty'],['Erin ','Erin']],  'eye color':[['blue','green'],['green'],['brown','brown','brown'],['blue'],['green','brown']]    

Выход:

 label breeds nicknames eye color 0 cat bengal [Loki,Loki] [blue, green] 1 dog shar pei [Max] [green] 2 dog pug [Toby,Zeus,Toby] [brown, brown, brown] 3 cat maine coon [Marty] [blue] 4 cat maine coon [Erin,Erin] [green, brown]  

Я хочу применить groupby :фрейм[«метка», «породы»] и рассчитать значения(уникальное значение ) псевдонимов и цвета глаз,но вывести их в разных столбцах: «nickname_count»,»eye_count» Этот код выводится только в одном столбце, как мне выводить отдельно?

 frame2=frame.groupby(['label','breeds'])['nicknames','eye color'].apply(lambda x: x.astype('str').value_counts().to_dict())  

Ответ №1:

Во-первых, мы используем символ groupby with sum в списках, поскольку sum он объединяет списки вместе :

 gt;gt;gt; df_grouped = df.groupby(['label', 'breeds']).agg({'nicknames': sum, 'eye color': sum}).reset_index() gt;gt;gt; df_grouped  label breeds nicknames eye color 0 cat bengal [Loki, Loki] [blue, green] 1 cat maine coon [Marty, Erin , Erin] [blue, green, brown] 2 dog pug [Toby, Zeus , Toby] [brown, brown, brown] 3 dog shar pei [Max] [green]  

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

 gt;gt;gt; df_grouped['nickname_count'] = df_grouped['nicknames'].apply(lambda x: list(set(x))).str.len() gt;gt;gt; df_grouped['eye_count'] = df_grouped['eye color'].apply(lambda x: list(set(x))).str.len() gt;gt;gt; df_grouped  label breeds nicknames eye color nickname_count eye_count 0 cat bengal [Loki, Loki] [blue, green] 1 2 1 cat maine coon [Marty, Erin , Erin] [blue, green, brown] 3 3 2 dog pug [Toby, Zeus , Toby] [brown, brown, brown] 2 1 3 dog shar pei [Max] [green] 1 1  

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

1. Но я хочу сгруппировать по меткам и породам, а затем посчитать

2. Действительно, я обновил ответ с помощью группы, а затем подсчитал количество элементов в списке. Это ответ на ваш вопрос ?

3. Спасибо за ответ, но это не совсем то, чего я хочу.. Я хотел бы больше походить на «слово»: подсчет, поэтому я хочу использовать value_counts

4. Вы хотите подсчитать уникальное значение ?

5. Да! Например, eye_count :(«синий»:2)…. а затем группировка