我有一個這樣的框架
presence_data = pd.DataFrame({
"id": ["id1", "id2"],
"presence": [
["A", "B", "C", "A"],
["G", "A", "B", "I", "B"],
]
})
| ID | 在場 |
|---|---|
| 編號1 | [甲、乙、丙、甲] |
| 編號2 | [G、A、B、I、B] |
我想把上面變成這樣的東西......
| ID | 一種 | 乙 | C | G | 一世 |
|---|---|---|---|---|---|
| 編號1 | 2 | 1 | 1 | 0 | 0 |
| 編號2 | 1 | 2 | 0 | 1 | 1 |
目前,我有一種方法,我遍歷行并遍歷存在列中的值,然后根據遇到的值創建/更新具有計數的新列。我想看看有沒有更好的方法。
uj5u.com熱心網友回復:
根據亨利·埃克 (Henry Ecker) 在評論中的反饋進行編輯,不妨在這里得到更好的答案:
您可以使用pd.explode()使串列中的所有內容成為單獨的行,然后用于pd.crosstab()計算出現次數。
df = presence_data.explode('presence')
pd.crosstab(index=df['id'],columns=df['presence'])
這給了我以下內容:
presence A B C G I
id
id1 2 1 1 0 0
id2 1 2 0 1 1
uj5u.com熱心網友回復:
from collections import Counter
(presence_data
.set_index('id')
.presence
.map(Counter)
.apply(pd.Series)
.fillna(0, downcast='infer')
.reset_index()
)
id A B C G I
0 id1 2 1 1 0 0
1 id2 1 2 0 1 1
速度上很難說;在python中處理python原生資料結構通常更有效,但這種解決方案有很多方法呼叫,這本身就比較昂貴
或者,您可以創建一個新的資料框(并減少方法呼叫的次數):
(pd.DataFrame(map(Counter, presence_data.presence),
index = presence_data.id)
.fillna(0, downcast='infer')
.reset_index()
)
id A B C G I
0 id1 2 1 1 0 0
1 id2 1 2 0 1 1
uj5u.com熱心網友回復:
您可以使用 apply 和 value_counts。首先,我們使用您的存在列中的串列來創建新列。然后我們可以使用 axis=1 來獲取行值計數。
df = pd.DataFrame(presence_data['presence'].tolist(), index=presence_data['id']).apply(pd.Series.value_counts, axis=1).fillna(0).astype(int)
print(df)
A B C G I
id
id1 2 1 1 0 0
id2 1 2 0 1 1
如果要將 id 作為列而不是索引,則可以在 after 中使用它。
df.reset_index(inplace=True)
print(df)
id A B C G I
0 id1 2 1 1 0 0
1 id2 1 2 0 1 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/369026.html
下一篇:如何隨機填充熊貓資料框中的X行?
