pandas:连接两个表并在即使没有匹配时填充值

时间:2015-05-19 18:19:26

标签: python pandas merge

不确定我该如何描述问题,所以我将使用下面的示例。 我想加入以下两个表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

1 个答案:

答案 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