我正在用Pandas分析调查数据,并拥有以下原始数据
Dept | Q3 | Q4 |
-----| ---- |---- |
HR | Yes | Yes |
IT | No | Yes |
HR | No | Yes |
HR | Yes | Yes |
IT | No | Yes |
IT | Yes | Yes |
我试着按部门分组;Q3,并获得所有"是"回答的总数以及该问题中"是"的百分比。像这样
Dept | Q3 - Yes | Total | %
-----| ----------| ----- | --
HR | 2 | 3 |
IT | 1 | 3 |
我已经使用下面的代码分组并获得总yes计数,但不确定如何将total和%添加到相同的数据帧
df.groupby("Dept")['Q3'].apply(lambda x: x[x.str.contains('Yes')].count())
任何帮助都会很感激。我有点卡住了。
谢谢!
你可以这样做:
out = df.groupby("Dept")["Q3"].agg([lambda x: (x == "Yes").sum(), "count"])
out.columns = ["Q3 - Yes", "Total"]
out["%"] = out["Q3 - Yes"] / out["Total"]
输出print(out)
Q3 - Yes Total %
Dept
HR 2 3 0.666667
IT 1 3 0.333333
您可以单独计算总数,并合并数据帧。
df2=df.groupby("Dept")['Q3'].apply(lambda x: x[x.str.contains('Yes')].count()
df3=df.groupby("Dept")['Q3'].count()
df4=pd.merge(df2,df3,on="Dept",how='outer')
print(df4)
让我们试试groupby
+agg
out = df.groupby('Dept').agg(lambda x : x.eq('Yes').sum()).join(df.groupby('Dept').size().to_frame('Total'))
Out[42]:
Q3 Q4 Total
Dept
HR 2 3 3
IT 0 2 2
It 1 1 1
这将为您提供第三季度的结果,如您的答案所示:
(pd.crosstab(df.Dept, df.Q3)
.assign(Total=lambda df: df.sum(1))
.loc[:, ["Yes", "Total"]])
Q3 Yes Total
Dept
HR 2 3
IT 1 3