4 回答
TA贡献1829条经验 获得超7个赞
您可以使用矢量化操作更有效地完成此操作(无需显式 python 循环)。这意味着我们所有的操作都由底层 C/C++ 函数执行,以实现巨大的加速。
out = (df.groupby("Date")["Yes/No"]
.value_counts()
.unstack(fill_value=0)
.rename_axis(columns=None)
.eval("percentage = Yes / (Yes + No)")
)
print(out)
No Yes percentage
Date
2020-10-24 0 2 1.000000
2020-10-25 2 1 0.333333
2020-10-26 1 2 0.666667
2020-10-27 2 0 0.000000
脚步:
df.groupby("Date")["Yes/No"]:按“日期”对数据框进行分组,然后从这些分组中选择“是/否”列
.value_counts():获取此列中每个分组的每个“是”和“否”的计数。
.unstack(fill_value=0):现在我们有了计数,我们将“是”和“否”放入各自的列中。
.rename_axis(columns=None):我们有一个看起来很有趣的列索引名称,我个人不喜欢这些,所以我要删除它。
.eval("percentage = Yes / (Yes + No)"):创建一个名为百分比的新列,并将所有“是”计数除以总响应计数(“是”+“否”)的值分配给它
TA贡献1783条经验 获得超4个赞
# groupby date and yes/no columns and get the size
# then pivot
new_df = df.groupby(['Date', 'Yes/No'], as_index=False).size().pivot('Date', 'Yes/No', 'size').replace(np.nan, 0)
# divide the yes column by the size of each group
new_df['percent_yes'] = new_df['Yes'] / new_df.sum(1)
print(new_df)
Yes/No No Yes percent_yes
Date
2020-10-24 0.0 2.0 1.000000
2020-10-25 2.0 1.0 0.333333
2020-10-26 1.0 2.0 0.666667
2020-10-27 2.0 0.0 0.000000
TA贡献1828条经验 获得超3个赞
您应该研究一下 one-hot 编码。熊猫用途pd.get_dummies
我的解决方案是:
df_new = pd.get_dummies(yes_no, columns=["Yes/No"]).groupby("Date").sum().rename(columns={"Yes/No_No":"No", "Yes/No_Yes":"Yes"}
然后你就可以轻松计算百分比。
TA贡献1862条经验 获得超6个赞
有一个非常简单的方法可以做到这一点,也许还有一些更优雅的方法:
import pandas as pd
df = pd.DataFrame({'Yes_no': ['yes','no','yes', 'yes', 'no','yes','no','yes', 'yes', 'no','yes','no','yes', 'yes', 'no','yes','no','yes', 'yes', 'no'],
'Dates': ['2019-07-01','2019-07-01','2019-07-01', '2019-07-03', '2019-07-03','2019-07-03','2019-07-07','2019-07-07', '2019-07-07', '2019-07-07','2019-07-07','2019-07-07','2019-07-07', '2019-07-07', '2019-07-07','2019-07-07','2019-07-07','2019-07-07', '2019-07-07', '2019-07-07']})
dff = df.groupby(['Yes_no','Dates'])['Yes_no'].count()
dff.unstack().T
要创建具有比例的额外列,只需定义一个新列
dff['prop']=dff['no']/dff['yes']
添加回答
举报