2015-05-19 43 views
1

不知道该如何描述该问题,因此我将使用下面的示例。 我想加入以下两个表df1和df2,以获得类似df3的表,其中每个时间都需要存在所有ID,A,B,C,D。pandas:即使没有匹配,连接两个表并填充值

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

你的合并没有任何意义,你在df1中拥有A和B的ID,但是在df2中它有C和D,所以你会得到NaN值,就像你找到的那样。否则,这里没有真正的关系,因为其他列的值相同。 – EdChum

+0

我简化了场景。因此,df2充当参考表,并且我需要为每个时间填充所有ID,以便当df1中的另一列(不在本例中,表示为realdata)缺少填充表df2中的某些内容时(在本例中不是proxydata)。我需要每次都这样做。后面的计算需要按所有ID的时间计算。希望它不那么令人困惑:)。 –

+1

不是真的,你需要更新你的例子来展示你的真实问题 – EdChum

回答

0

我不认为这个问题是合并,而是需要定义缺失的值。

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 

的代码的其余部分是相同的,并产生:我想通过制造具有所有要出现在最终的数据帧的时间& ID连击中间数据框中为此

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 
相关问题