#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