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

Python 获取分类变量的相对频率(根据计数过滤)?,python,pandas,dataframe,Python,Pandas,Dataframe,我得到了一个学生测试结果的数据框,其中我感兴趣的两列是国家和结果,如下所示: country result FR Pass FR Fail US Pass US Pass DK Fail DK Fail SE Pass ... ... 我想弄清楚的是,如何计算每个国家的相对“不及格”频率,下降(意思是——我希望那个国家的学生不及格,占那个国家所有学生的百分比),但

我得到了一个学生测试结果的数据框,其中我感兴趣的两列是
国家
结果
,如下所示:

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查询来完成这项工作,但就我个人而言,我不知道如何用熊猫来完成这项工作

您可以使用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

您可以使用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

您的输入数据不完整。。。此外,到目前为止,您在Python中尝试了什么?这不是一个你有免费咖啡的地方…你的输入数据不完整。。。此外,到目前为止,您在Python中尝试了什么?这不是一个你有免费咖啡的地方。。。