Группировка по расчету панды

#python #pandas #dataframe #group-by #pandas-groupby

Вопрос:

У меня есть фрейм данных после применения groupby :

 category | item
------------------
A        | a_item1
         | a_itme2
         | a_item3
------------------
B        | b_item1
         | b_item2
------------------
 

По этому поводу я хочу добавить новый столбец с вычислением: 10 / (no of items per category) .
Для примера данных это будет:

 category | item   |  value
----------------------------
A        | a_item1|   3.33
         | a_itme2|   3.33
         | a_item3|   3.33
----------------------------
B        | b_item1|   5
         | b_item2|   5
-----------------------------
 

Как это можно сделать?

Комментарии:

1. Можете ли вы предоставить минимальный воспроизводимый код? Я хочу попробовать это.

Ответ №1:

Используйте Series.value_counts с Series.map :

 df['value'] = 10 / df['category'].map(df['category'].value_counts())  
 

Или:

 df['value'] = df['category'].map(df['category'].value_counts()).rdiv(10)
 

Ответ №2:

Вы можете использовать groupby вместе с transform :

 df['value'] = 10 / df.groupby('category')['item'].transform('count')
 

Ответ №3:

Вы можете использовать функцию pandas apply для кадров данных.

Определите функцию, которую вы хотите применить к каждой строке:

 def get_value(s: pd.Series):
    vc = df['category'].value_counts()
    return 10/vc[s['category']]
 

Используйте применить к каждой строке:

 df['value'] = df.apply(get_value, axis=1)
df

#   category    item     value
# 0        A    a_item1  3.333333
# 1        A    a_item2  3.333333
# 2        A    a_item3  3.333333
# 3        B    b_item1  5.000000
# 4        B    b_item2  5.000000
 

Вы также можете предварительно вычислить количество значений и добавить их в качестве аргументов в функцию apply.