我在熊貓中有一個具有以下結構的表:
import pandas as pd
df = pd.DataFrame({
"user_id": [1, 2, 3],
"user_events": [1, 2, 3],
"user_successes": [0, 1, 2]
})
我想把它寫成長格式。在這種情況下,對于每個用戶,我們有不同數量的事件和成功。我想把它轉換成一個事件表(每一行對應一個事件,有一列告訴你它是否成功)。在這種情況下,輸出資料幀應該是:
out_df = pd.DataFrame({
"user_id": [1, 2, 2, 3, 3, 3],
"success": [0, 1, 0, 1, 1, 0]
})
在熊貓中這樣做最簡單的方法是什么?我想避免在每個用戶上迭代、創建資料幀然后附加它們的 for 回圈。
uj5u.com熱心網友回復:
您可以嘗試使用reindex,repeat然后使用創建的限制條件分配值groupby cumsum
s = df.reindex(df.index.repeat(df.user_events))
s['success'] = 1
s['success'] = s['success'].where(s.groupby('user_id')['success'].cumsum()<=s['user_successes'],0)
s
Out[54]:
user_id user_events user_successes success
0 1 1 0 0
1 2 2 1 1
1 2 2 1 0
2 3 3 2 1
2 3 3 2 1
2 3 3 2 0
uj5u.com熱心網友回復:
重新索引的一種選擇:
df2 = df.set_index('user_id')
out = (df
[['user_id']]
.loc[df.index.repeat(df2['user_events'])]
.assign(success=lambda d: d.groupby('user_id').cumcount()
.lt(d['user_id'].map(df2['user_successes']))
.astype(int)
)
)
輸出:
user_id success
0 1 0
1 2 1
1 2 0
2 3 1
2 3 1
2 3 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/505749.html
