группа выбора эквивалента панды (отличный col1, col2) группа по col3 - PullRequest
0 голосов
/ 16 мая 2018

Make DataFrame:

people = ['shayna','shayna','shayna','shayna','john']
dates = ['01-01-18','01-01-18','01-01-18','01-02-18','01-02-18']
places = ['hospital', 'hospital', 'inpatient', 'hospital', 'hospital']
d = {'Person':people,'Service_Date':dates, 'Site_Where_Served':places}
df = pd.DataFrame(d)
df

Person   Service_Date   Site_Where_Served
shayna   01-01-18       hospital 
shayna   01-01-18       hospital 
shayna   01-01-18       inpatient 
shayna   01-02-18       hospital 
john     01-02-18       hospital 

Я хотел бы подсчитать уникальные пары Person и их Service_Date, сгруппированные по Site_Where_Served.

Ожидаемый результат:

Site_Where_Served    Site_Visit_Count
hospital             3
inpatient            1

Моя попытка:

df[['Person', 'Service_Date']].groupby(df['Site_Where_Served']).nunique().reset_index(name='Site_Visit_Count')

Но тогда он не знает, как сбросить индекс.Итак, я попытался пропустить это и понял, что он не учитывает уникальную пару «Person» и «Service_Date», потому что результат выглядит следующим образом:

                   Person    Service_Date
Site_Where_Served
hospital              2           2 
inpatient             1           1 

Ответы [ 4 ]

0 голосов
/ 16 мая 2018

Counter 1

pd.Series(Counter(df.drop_duplicates().Site_Where_Served)) \
    .rename_axis('Site_Where_Served').reset_index(name='Site_Visit_Count')

  Site_Where_Served  Site_Visit_Count
0          hospital                 3
1         inpatient                 1

Counter 2

pd.DataFrame(
    list(Counter(t[2] for t in set(map(tuple, df.values))).items()),
    columns=['Site_Where_Served', 'Site_Visit_Count']
)

  Site_Where_Served  Site_Visit_Count
0          hospital                 3
1         inpatient                 1
0 голосов
/ 16 мая 2018

На мой взгляд, лучший способ - удалить дубликаты перед использованием groupby.size:

res = df.drop_duplicates()\
        .groupby('Site_Where_Served').size()\
        .reset_index(name='Site_Visit_Count')

print(res)

  Site_Where_Served  Site_Visit_Count
0          hospital                 3
1         inpatient                 1
0 голосов
/ 16 мая 2018

Может быть value_counts

(df.drop_duplicates()
   .Site_Where_Served
   .value_counts()
   .to_frame('Site_Visit_Count')
   .rename_axis('Site_Where_Served')
   .reset_index()
)

  Site_Where_Served  Site_Visit_Count
0          hospital                 3
1         inpatient                 1
0 голосов
/ 16 мая 2018

drop_duplicates с groupby + count

(df.drop_duplicates()
   .groupby('Site_Where_Served')
   .Site_Where_Served.count()
   .reset_index(name='Site_Visit_Count')
)

  Site_Where_Served  Site_Visit_Count
0          hospital                 3
1         inpatient                 1

Обратите внимание, одно крошечное различие между count / size состоит в том, что первый не учитывает записи NaN.


Туплизация, groupby и nunique

Это действительно только исправление вашего текущего решения, но я бы не рекомендовал это, поскольку оно довольно затянуто и содержит больше шагов, чем необходимо. Сначала увеличьте ваши столбцы, сгруппируйте их по Site_Where_Served, а затем подсчитайте:

(df[['Person', 'Service_Date']]
   .apply(tuple, 1)
   .groupby(df.Site_Where_Served)
   .nunique()
   .reset_index(name='Site_Visit_Count')
)

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