我有一个学生测试结果的DataFrame,我感兴趣的两列是country
和result
,如:
country result
FR Pass
FR Fail
US Pass
US Pass
DK Fail
DK Fail
SE Pass
... ...
我想弄清楚的是如何获得亲戚"失败"每个国家的频率,下降(意思是 - 我希望来自该国家的学生失败,占该特定国家所有学生的百分比),但仅限于那些已经超过的国家,让我们说200名学生参加测试:
country % fail students
FR 0.056 997
US 0.051 855
DK 0.042 627
NL 0.032 511
我看到工作中的同事用非常简短的SQL查询来做这件事,但对于我的生活,我无法弄清楚如何用熊猫做到这一点!
答案 0 :(得分:2)
您可以使用groupby.agg。首先,我创建了一个随机数据集:
import numpy as np
np.random.seed(0)
countries = ["FR", "US", "DK", "SE", "NL"]
df = pd.DataFrame({"country": np.random.choice(countries, 1000), "result": np.random.choice(["Pass", "Fail"], 1000)})
它有1000行,包含国家/地区和结果列。然后我使用groupby找到百分比。
gb = df.groupby("country")
gb['result'].agg(lambda x: len(x[x=="Fail"]) / len(x))[gb.size() > 195]
Out[100]:
country
FR 0.472362
SE 0.520362
US 0.553299
Name: result, dtype: float64
第一部分(gb['result'].agg(lambda x: len(x[x=="Fail"]) / len(x))
)计算百分比,[gb.size() > 195]
对其进行过滤,以便仅显示超过195名学生的百分比。
对于样本输出的完全匹配,您可以尝试这样的事情:
gb['result'].agg({"% fail": lambda x: len(x[x=="Fail"]) / len(x), "students": len})[gb.size() > 195].sort_values(by="% fail", ascending=False)
Out[119]:
% fail students
country
US 0.553299 197
SE 0.520362 221
FR 0.472362 199