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中尝试了什么?这不是一个你有免费咖啡的地方。。。