我正在努力解決熊貓的條件計數問題。問題我有一個 pandas 數據框,有 4 列(為了這個例子):“id”、“id2”、“col1”和“type”。類型列可以有3個值,即“A”、“B”和“C”。我想做的是,對于每一行,計算具有相同 id 和 id2 的類型 C 的數量。這是一個示例數據框: id id2 col1 type0 "e" "z" 0 "A"1 "e" "z" 1 "C"2 "e" "z" 2 "C"3 "e" "y" 3 "C"4 "e" "y" 4 "A" 5 "f" "y" 4 "A"6 "f" "x" 3 "B"7 "f" "x" 4 "B"8 "g" "w" 5 "C"9 "g" "w" 6 "B"構建示例數據框的代碼:pd.DataFrame({ "id": ["e", "e", "e", "e", "e", "f", "f", "f", "g", "g"], "id2": ["z", "z", "z", "y", "y", "x", "x", "x", "w", "w"], "col1": [ 0 , 1 , 2 , 3 , 4 , 4 , 3 , 4 , 5 , 6 ], "type": ["A", "C", "C", "C", "A", "A", "B", "B", "C", "B"]})以及期望的結果: id id2 col1 type count0 "e" "z" 0 "A" 21 "e" "z" 1 "C" 22 "e" "z" 2 "C" 2 3 "e" "y" 3 "C" 14 "e" "y" 4 "A" 15 "f" "y" 4 "A" 06 "f" "x" 3 "B" 07 "f" "x" 4 "B" 08 "g" "w" 5 "C" 19 "g" "w" 6 "B" 1我并不真正關心類型為“C”的行(例如第1、2、3、8行)會發生什么,所以如果它們沒有出現在結果數據框中,這不是問題。我想要一個不依賴于通過數據集迭代“我自己”的解決方案(不應用也不for循環),因為它們太慢了。我希望找到一種解決問題的“pandaic”方法。注意:在“真實”數據集中,有 3 列用于索引,類型可以有 5 個不同的值,并且應保留 36 個數據列。但我更喜歡可擴展的解決方案,不受這些數量的限制。我嘗試過的我可以使用 sqlalchemy 和查詢來解決問題。事實上,結果應該與以下查詢匹配:SELECT a.*, (SELECT COUNT(*) FROM df b WHERE b.id = a.id AND b.id2 = a.id2 AND b.type = "C")FROM df a最初的問題也可以改寫為“相當于這個查詢的Python代碼是什么?”。我也可以使用 apply 來解決問題。由于數據集的大小,兩者都非常慢,盡管 sql 方法可能很慢,因為它必須首先構建數據庫。相關文章這篇文章幾乎解決了問題,但不適用于外部數據列,也不適用于多個索引,并且我無法將它們適應我的示例。這條線接近我正在尋找的內容,唯一的問題是它只保留您分組的列:df.groupby(["id", "id2", "type"]).size().unstack().reset_index()如果缺少任何信息,請告訴我。感謝您花時間閱讀我的帖子,并對拼寫錯誤表示歉意!
1 回答

白豬掌柜的
TA貢獻1893條經驗 獲得超10個贊
嘗試這個:
answer = df.groupby(['id','id2']).transform(sum)['type'].str.count('C')
pd.concat([df,answer], axis=1)
id id2 col1 type type
0 e z 0 A 2
1 e z 1 C 2
2 e z 2 C 2
3 e y 3 C 1
4 e y 4 A 1
5 f x 4 A 0
6 f x 3 B 0
7 f x 4 B 0
8 g w 5 C 1
9 g w 6 B 1
您可以將 groupby 中的列增加到您想要的數量/數量。
添加回答
舉報
0/150
提交
取消