我正在嘗試合并許多 DataFrame。如果用戶在任何日期的DataFrame中都不存在,只需保留某些列的資訊(例如用戶名)并將某些數字型別列的值設定為0。
df1 = pd.DataFrame({'user': ['A', 'B'],
'dt': ['2016-01-01', '2016-01-01'],
'userID': ['xxxa', 'yyyb'],
'val': [11, 22],
'val2': [111, 222]})
df2 = pd.DataFrame({'user': ['A', 'A', 'C'],
'dt': ['2016-02-13', '2016-02-13', '2016-02-13'],
'userID': ['xxxa', 'kkka', 'jjjc'],
'val': [33, 44, 55],
'val2': [333, 444, 555]})
特定日期的 DataFrame 1:
dt user userID val val2 val3...
0 2016-01-01 A xxxa 11 ...
1 2016-01-01 B yyyb 22 ...
另一個日期的 DataFrame 2:
dt user userID val val2 val3...
0 2016-02-13 A xxxa 33 ...
1 2016-02-13 A kkka 44 ...
2 2016-02-13 C jjjc 55 ...
所需的合并結果:
dt user userID val val2 val3...
0 2016-01-01 A xxxa 11 ...
1 2016-02-13 A xxxa 33 ...
2 2016-01-01 A kkka 0 ...
3 2016-02-13 A kkka 44 ...
4 2016-01-01 B yyyb 22 ...
5 2016-02-13 B yyyb 0 ...
6 2016-01-01 C jjjc 0 ...
7 2016-02-13 C jjjc 55 ...
uj5u.com熱心網友回復:
您可以使用concat 為每個“用戶”pivot和fillna“用戶 ID”填寫缺失的日期;然后stack是日期 ( level=1) 以獲取所需形狀的所需資料。然后進行一些外觀更改以獲得所需的輸出:
out = (pd.concat((df1, df2))
.pivot(['userID','user'], ['dt'], ['val','val2'])
.fillna(0)
.stack(level=1)
.reset_index()
[['dt','user','userID','val','val2']]
.sort_values('user')
.reset_index(drop=True))
輸出:
dt user userID val val2
0 2016-01-01 A kkka 0.0 0.0
1 2016-02-13 A kkka 44.0 444.0
2 2016-01-01 A xxxa 11.0 111.0
3 2016-02-13 A xxxa 33.0 333.0
4 2016-01-01 B yyyb 22.0 222.0
5 2016-02-13 B yyyb 0.0 0.0
6 2016-01-01 C jjjc 0.0 0.0
7 2016-02-13 C jjjc 55.0 555.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/434036.html
