Pandas: идиоматический c способ выполнения нескольких сложных агрегаций? - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть следующая таблица:

ID   SCORE
A    NaN
A    NaN
B    1
B    2
C    5

Я хочу следующий вывод:

ID    SUM_SCORE   SIZE_SCORE
A     NaN         2
B     3           2
C     5           1

Поскольку я хочу сохранить NaN, мне нужно использовать sum(min_count=1). Итак, у меня пока есть следующее:

grp = df.groupby('ID')
sum_score = grp['SCORE'].sum(min_count=1).reset_index()
size_score = grp['SCORE'].size().reset_index()
result = pd.merge(sum_score, size_score, on=['ID'])

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

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

IIU C

s=df.groupby('ID').SCORE.agg([('sum_score',lambda x : x.sum(min_count=1)),
                             ('size_score','size')] ).reset_index()
  ID  sum_score  size_score
0  A        NaN           2
1  B        3.0           2
2  C        5.0           1
0 голосов
/ 26 апреля 2020

Вы можете агрегировать, используя следующее:

df_agg = df.groupby("ID", as_index=False).agg(["sum","count"])

# rename your columns
df_agg.columns = ["ID","SUM_SCORE", "SIZE_SCORE"]
...