наибольшее значение pandas для группы с несколькими столбцами / почему это работает только при выравнивании?

#python #pandas #dataframe #group-by #multi-index

#python #pandas #фрейм данных #группировка по #многоиндексный

Вопрос:

Для фрейма данных pandas из:

 import pandas as pd

df = pd.DataFrame({
    'id': [1, 1, 2, 1], 'anomaly_score':[5, 10, 8, 100], 'match_level_0':[np.nan, 1, 1, 1], 'match_level_1':[np.nan, np.nan, 1, 1], 'match_level_2':[np.nan, 1, 1, 1]
})
display(df)
df = df.groupby(['id', 'match_level_0']).agg(['mean', 'sum'])
  

Я хочу вычислить самые большие строки для каждой группы.

 df.columns = ['__'.join(col).strip() for col in df.columns.values]
df.groupby(['id'])['anomaly_score__mean'].nlargest(2)
  

Работает, но требует выравнивания multiindex для столбцов.

Вместо этого я хочу напрямую использовать,

 df.groupby(['id'])[('anomaly_score', 'mean')].nlargest(2)
  

Но это не удается, так как ключ не найден.
Интересно, что он отлично работает, когда не группируется:

 df[('anomaly_score', 'mean')].nlargest(2)
  

Ответ №1:

Для меня работает группировка Series с помощью первого уровня MultiIndex , но, похоже, ошибка, почему не работает, как в вашем решении:

 print (df[('anomaly_score', 'mean')].groupby(level=0).nlargest(2))
id  match_level_0
1   1.0              55
2   1.0               8
Name: (anomaly_score, mean), dtype: int64

print (df[('anomaly_score', 'mean')].groupby(level='id').nlargest(2))