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']
添加回答
舉報