Как подсчитать уникальные комбинации строк в группе фреймов данных? - PullRequest
1 голос
/ 20 июня 2020

Я хотел бы использовать pandas groupby, чтобы подсчитать появление комбинации животных на каждой ферме (обозначается farm_id). Я пытаюсь подсчитать количество ферм с каждым типом комбинации животных.

Желаемый результат будет примерно таким:

Out[6]: 
                 combo  count
0                  cow      1
1       [cow, chicken]      1
2  [cow, pig, chicken]      2

Для следующего фрейма данных:

df = pd.DataFrame([['cow',0],['chicken',0],
                   ['cow',1],
                   ['chicken',3],['pig',3],['cow',3],
                   ['pig',4],['cow',4],['chicken',4]]
                   ,columns=['animals','farm_id'])

df
Out[4]: 
   animals  farm_id
0      cow        0
1  chicken        0
2      cow        1
3  chicken        3
4      pig        3
5      cow        3
6      pig        4
7      cow        4
8  chicken        4

Обратите внимание, порядок появления животных не имеет значения.

Я пробовал это:

df.groupby('farm_id').agg({'animals':'unique'})
Out[7]: 
                     animals
farm_id                     
0             [cow, chicken]
1                      [cow]
3        [chicken, pig, cow]
4        [pig, cow, chicken]

Это дает мне комбинации, но (1) порядок учитывается и (2) я не уверен, как создать счет как отдельный столбец.

Ответы [ 3 ]

1 голос
/ 20 июня 2020

Попробуйте:

import pandas as pd
from collections import Counter

df_1=df.groupby('farm_id')['animals'].unique().apply(list).apply(lambda x: sorted(x)).reset_index()

Подсчитайте количество вхождений

dict=Counter([tuple(i) for i in df_1['animals']])

counter_df=pd.DataFrame.from_dict(dict, orient='index').reset_index()
counter_df.columns=['combo','count']
0 голосов
/ 20 июня 2020
import pandas as pd
df = pd.DataFrame([['cow',0],['chicken',0],
               ['cow',1],
               ['chicken',3],['pig',3],['cow',3],
               ['pig',4],['cow',4],['chicken',4]]
               ,columns=['animals','farm_id'])
df  = df.sort_values(['animals','farm_id'])
df = df.groupby('farm_id').agg({'animals':'unique'})
df['animals'] = df['animals'].astype(str)
df2 = pd.DataFrame(df.animals.value_counts())
df = pd.merge(df, df2, left_on = 'animals', right_index = True,how = 'left')
df.columns = ['animal_combination','count']
df
0 голосов
/ 20 июня 2020
df = df.groupby('farm_id')['animals'].unique().apply(lambda x: tuple(sorted(x))).reset_index().rename(columns={'farm_id':'count'})
print(df.groupby('animals').count())

Ключ к этому решению - сделать список животных хешируемым, используя кортеж, а затем отсортировать этот кортеж, чтобы мы могли подсчитать количество появлений комбо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...