這就是資料框架
日期 名稱 嘗試次數 0 2015-01-02 Adam Yes 1 2015-01-29 Adam Yes 2 2015-02-02 David 否 3 2015-03-02 David 是 4 2015-03-02 Hardik 是 5 2015-03-02 David 否現在我需要按月計算一個人的嘗試次數。我想只計算嘗試值為 "是 "的情況,并在計數列中插入該值。
這就是預期的輸出
Date Name Attempt Count 0 2015-01-02 Adam 是 2 1 2015-01-29 Adam Yes 2 2 2015-02-02 David 不 0 3 2015-03-02 David 是 1 4 2015-03-02 Hardik 是 1 5 2015-03-02 David 不 1uj5u.com熱心網友回復:
將
Date列轉換為資料時間型別(如果還沒有的話),然后指定一個臨時列作為月份,從Date列中提取月份值。然后過濾掉
Attempt列中具有Yes值的行,并通過month和Name列來分組,然后呼叫size來獲得計數,最后呼叫to_frame傳遞count作為列名來創建一個資料框架出來。并通過left合并將其與資料框架合并,在on引數中傳遞公共鍵,然后fillna(0),洗掉月份列,并將計數列轉換為整數型別。df['Date'] = pd.to_datetime(df['Date'] ) df['month']=df['Date'].dt.month (df.merge(df[df['Attempt'].eq('Yes')]) .groupby(['month', 'Name'] ) .size() .to_frame('count')。 how='left', on=['month', 'Name'] ).fillna(0).drop(columns='month').astype({'count':int}) ) 日期 名稱 嘗試數 0 2015-01-02 Adam 是 2 1 2015-01-29 Adam Yes 2 2 2015-02-02 David 不 0 3 2015-03-02 David 是 1 4 2015-03-02 Hardik 是 1 5 2015-03-02 David 不 1uj5u.com熱心網友回復:
你需要將日期和名字按月頻率分組,并通過之前的過濾來計算有多少次嘗試是 "是":
res = df[df["Attempt"].eq("Yes")] .groupby([pd.Grouper(key='date', freq='M'), 'Name']) ["Attempt"] .count()然后你可以使用
map來分配資料:my_map = dict(zip(res.index.get_level_values('Name'), res.values) df["Counts"] = df["Name"].map(my_map)輸出:
日期名稱嘗試次數 0 2015-01-02 Adam 是 2 1 2015-01-29 Adam Yes 2 2 2015-02-02 David 不 1 3 2015-03-02 David Yes 1 4 2015-03-02 Hardik 是 1 5 2015-03-02 David 不 1(注意,David在'2015-02-02'上有1次嘗試,顯然你不想要。為了解決這個問題,只需使用簡單的切片規則,如:
df.loc[df["Attempt"/span>]. eq("Yes"), "Counts"] = df.loc[df["Attempt"]. .eq("Yes"), "Name"] 。 .map(my_map)在這種情況下,你會得到:
。日期名稱嘗試次數 0 2015-01-02 Adam 是 2.0 1 2015-01-29 Adam Yes 2.0 2 2015-02-02 David No NaN 3 2015-03-02 David Yes 1. 4 2015-03-02 Hardik 是 1.0 5 2015-03-02 David No NaN在看到@ThePyGuy的漂亮回答后。我對檢查他和我的建議的性能很感興趣(我希望沒有一個比另一個更 "正確";),發現他的建議需要4.53ms,而我的建議需要2.39ms。請注意,這些統計資料是針對這個小資料集的。性能可能會隨著資料框架的大小而發生奇怪的變化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/306627.html
標籤:
