У меня есть фрейм данных Pandas, который выглядит так:
Я хочу получить процент сдачи и сгруппировать его по типу, местоположению и зачислению, чтобы он выглядел примерно так:
Чтобы создать вышеуказанный фрейм данных:
import pandas as pd
list_of_dict = [
{"type": "student", "location": "US", "pass": "yes", "enrolled": "highschool"},
{"type": "student", "location": "CA", "pass": "yes", "enrolled": "highschool"},
{"type": "teacher", "location": "US", "pass": "yes", "enrolled": "college"},
{"type": "teacher", "location": "US", "pass": "no", "enrolled": "college"},
{"type": "student", "location": "US", "pass": "no", "enrolled": "highschool"},
{"type": "student", "location": "CA", "pass": "yes", "enrolled": "college"},
{"type": "student", "location": "CA", "pass": "no", "enrolled": "college"},
]
df = pd.DataFrame(list_of_dict)
Я знаю, что мне нужно получить .count() при группировке по «типу», «местоположению» и «зачислению».
Я пробовал:
df = df.groupby(["type", "location", "enrolled"]).count().mean()
Но это просто дает мне целое число.
Вы можете заменить 'yes'
и 'no'
на 1
и 0
соответственно в столбце 'pass'
, затем groupby
в других столбцах и получить mean
.
df["pass"] = df["pass"].map({"yes": 1, "no": 0})
df = (
df.groupby(["type", "location", "enrolled"])["pass"]
.mean()
.reset_index(name = "pass_rate")
)
type location enrolled pass_rate
0 student CA college 0.5
1 student CA highschool 1.0
2 student US highschool 0.5
3 teacher US college 0.5
Вы также можете выполнить замену на месте df.replace({'pass': {'yes':1, 'no':0}}).groupby.....
Код
используйте crosstab
с normalize=0
out = (pd.crosstab([df['type'], df['location'], df['enrolled']],
df['pass'], normalize=0)['yes']
.reset_index(name='pass_rate')
)
вне:
type location enrolled pass_rate
0 student CA college 0.5
1 student CA highschool 1.0
2 student US highschool 0.5
3 teacher US college 0.5
если вы хотите использовать groupby
, используйте следующий код:
out = (
df['pass'].eq('yes')
.groupby([df['type'], df['location'], df['enrolled']])
.mean()
.reset_index(name='pass_rate')
)
тот же результат
Плюс 1 от меня... отличное решение с использованием среднего значения.