#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.