Как получить отчетливое среднее значение в Pandas Groupby в Python? - PullRequest
1 голос
/ 03 августа 2020

У меня есть такие данные:

Вход

>>> import pandas as pd
>>> df.head(8)
date          id       count
01.02.2020    a        5
01.02.2020    b        10
02.02.2020    a        6
02.02.2020    b        11
03.02.2020    a        9
03.02.2020    a        13
03.02.2020    b        3
03.02.2020    b        5
...

Желаемый результат

date          distinctAverage
01.02.2020    7.5
02.02.2020    8.5
03.02.2020    15         # (9+13+3+5)/2, because 2 distinct entries out of 4 entries
...

Функция

Я хочу вычислить уникальное среднее значение "count" для уникальных идентификаторов в выражении groupby. Я группирую данные следующим образом:

df.groupby(
    ["date"]
    ).agg(
        #sumCount=("count", "sum"), # works!
        #countUniqueIDs=("id", lambda x: x.nunique()),  # works!
        distinctAverage=("count", lambda x, y=df["id"]: x.sum() / y.nunique()), # Doesn't work!
        distinctAverage2=("count", "mean") # Doesn't work, takes 4 as the denominator at 03.02.2020
    ).reset_index()

Есть идеи, как достичь sh четкого среднего?

РЕДАКТИРОВАТЬ: Ответ: Отдельное среднее значение, как упомянуто выше, отлично подходит для образца данные. В большем наборе данных, который не может быть отображен здесь, он не работает (по какой-либо причине!), И есть обходной путь: после использования groupby и агрегирования "sumCount" и "countUniqueIDs" добавьте еще одну строку после groupby: df["workaroundDistinctAverage"] = df["sumCount"] / df["countUniqueIDs"] Не очень элегантно, но легче понять, чем принятый ответ.

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Сохраните результат .groupby() в переменной, а затем вычислите, что вам нужно, с помощью .sum() и .nunique()

grouper = df.groupby(['date'])

(
  (grouper['count'].sum() / grouper['id'].nunique())
  .reset_index(name = 'distinctAverage')
)
#output:
    date        distinctAverage
0   01.02.2020  7.5
1   02.02.2020  8.5
2   03.02.2020  15.0
1 голос
/ 03 августа 2020

Это прекрасно работает!

df.groupby(["date"]).agg(
        distinctAverage=("count", lambda x, y=df["id"]: float(x.sum()/ y.nunique()))
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...