不确定我该如何描述问题,所以我将使用下面的示例。 我想加入以下两个表df1和df2来获得像df3这样的表,其中每个时间都需要存在所有ID,A,B,C,D。
d1 = {'Time': [1,1,2,2], 'BinID': ['x']*4, 'V1': [25, 30, 22, 28], 'ID': ['A','B']*2}
df1 = pd.DataFrame(d1)
BinID ID Time V1
0 x A 1 25
1 x B 1 30
2 x A 2 22
3 x B 2 28
d2 = {'BinID': ['x']*4, 'ID': ['A','B','C','D'], 'V2': [26]*4}
df2= pd.DataFrame(d2)
BinID ID V2
0 x A 26
1 x B 26
2 x C 26
3 x D 26
我想得到这样的东西:
BinID_x ID V2 BinID_y Time V1
0 x A 26 x 1 25
1 x B 26 x 1 30
2 x C 26 x 1 NaN
3 x D 26 x 1 NaN
4 x A 26 x 2 22
5 x B 26 x 2 28
6 x C 26 x 2 NaN
7 x D 26 x 2 NaN
但左连接只能让我这个......
pd.merge(df2, df1, on = 'ID', how = 'left')
BinID_x ID V2 BinID_y Time V1
0 x A 26 x 1 25
1 x A 26 x 2 22
2 x B 26 x 1 30
3 x B 26 x 2 28
4 x C 26 NaN NaN NaN
5 x D 26 NaN NaN NaN
答案 0 :(得分:0)
我不认为问题是合并,而是你需要定义缺少的值。我会通过制作一个具有所有时间和范围的中间数据帧来实现这一点。您希望出现在最终数据框中的ID组合:
df1a = pd.DataFrame({'Time': [1,1,2,2], 'BinID': ['x']*4,
'V1': [25, 30, 22, 28], 'ID': ['A','B']*2})
df1b = pd.DataFrame({'Time': [1]*4+[2]*4, 'ID': list('ABCD')*2 })
df1 = pd.merge( df1b, df1a, on=['Time','ID'], how='left' )
df1b
ID Time
0 A 1
1 B 1
2 C 1
3 D 1
4 A 2
5 B 2
6 C 2
7 D 2
其余代码相同并产生:
pd.merge(df2, df1, on = 'ID', how = 'outer').sort(['Time','ID'])
BinID_x ID V2 Time BinID_y V1
0 x A 26 1 x 25
2 x B 26 1 x 30
4 x C 26 1 NaN NaN
6 x D 26 1 NaN NaN
1 x A 26 2 x 22
3 x B 26 2 x 28
5 x C 26 2 NaN NaN
7 x D 26 2 NaN NaN