Панды рассчитывают на str с total

#python #pandas

#python #pandas

Вопрос:

Я работаю над анализом данных опроса с помощью Pandas и имею следующие исходные данные

 Dept |  Q3  | Q4  |
-----| ---- |---- |
HR   | Yes  | Yes |
IT   | No   | Yes |
HR   | No   | Yes |
HR   | Yes  | Yes |
IT   | No   | Yes |
IT   | Yes  | Yes |
 

Я пытаюсь сгруппировать Dept amp; Q3 и получить количество всех ответов «да» с общим количеством ответов и процентом «да» в этом вопросе. Что-то вроде этого

 Dept |  Q3 - Yes | Total |  %
-----| ----------| ----- | --
HR   |     2     |  3    |
IT   |     1     |  3    |
 

Я использовал приведенный ниже код для группировки и получения общего количества yes, но не уверен, как добавить total и% к тому же фрейму данных для этой groupby

 df.groupby("Dept")['Q3'].apply(lambda x: x[x.str.contains('Yes')].count())
 

Любая помощь будет оценена. Я вроде как застрял.

Спасибо!

Ответ №1:

Вы можете сделать это таким образом:

 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

 

Ответ №2:

Вы можете рассчитать общее количество отдельно и объединить фреймы данных.

 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)
 

Ответ №3:

Давайте попробуем 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
 

Ответ №4:

Это дает вам результаты за третий квартал, как показывает ваш ответ:

 (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