Pandas count on str with total



我正在用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

最新更新