获取分类变量的相对频率(按计数过滤)?

时间:2016-06-26 15:41:03

标签: python pandas dataframe

我有一个学生测试结果的DataFrame,我感兴趣的两列是countryresult,如:

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查询来做这件事,但对于我的生活,我无法弄清楚如何用熊猫做到这一点!

1 个答案:

答案 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