У меня есть этот фрейм данных:
Name | Survey_A | Survey_B
----------------------------
A | y | z
A | z | z
A | y | y
B | z | y
B | z | y
B | y | z
, и я хотел бы получить нормализованные значения значений каждого типа в Survey_A и Survey_B, сгруппированные по имени.
Я знаю, как получитьvalue_counts с использованием функции agg
:
(df
.groupby('Name')
.agg({i:'value_counts' for i in
df[['Survey_A', 'Survey_B']]})
, которая дает:
Name | type | Survey_A | Survey_B
--------------------------------------
A | y | 2 | 1
| z | 1 | 2
B | y | 1 | 2
| z | 2 | 1
Но я не знаю, как получить нормализованный value_counts
как тот, который я использую pandas.Series.value_counts(normalize=True)
Я знаю, как это сделать для одного столбца:
(df
.groupby('Name')['Survey_A']
.value_counts(normalize=True))
Что дает:
Name | type | Survey_A
--------------------------
A | y | 0.666
| z | 0.333
B | y | 0.333
| z | 0.666
Но не для нескольких.Я пробовал с:
(df
.groupby('Name')
.agg({i: lambda x:
x.value_counts(normalize=true) for i
in df[['Survey_A', 'Survey_B']]}))
Но безуспешно .
Это возможно с помощью пользовательской функции, подобной этой:
def get_pct(g):
output = pd.DataFrame()
for c in g[['Survey_A', 'Survey_B']]:
output[c] = g[c].value_counts(normalize=True)
return output
df.groupby('Name').apply(get_pct)
НоИнтересно, есть ли более пандашский способ сделать это ...