2014-07-10 79 views
4

我有两个数据帧,我想串联(轴= 1)与内部联接。其中dataframes有一些重复的指标,但是行不重复,我不想从那些丢失数据:熊猫:连接数据帧,并保持重复索引

df1 = pd.DataFrame([{'a':1,'b':2},{'a':1,'b':3},{'a':2,'b':4}], 
        columns = ['a','b']).set_index('a') 

df2 = pd.DataFrame([{'a':1,'c':5},{'a':2,'c':6}],columns = ['a','c']).set_index('a') 

>>> df1 
    b 
a 
1 2 
1 3 
2 4 
8 9 

>>> df2 
    c 
a 
1 5 
2 6 

默认concat行为与NaN的,以填补缺失值:

>>> pd.concat([df1,df2]) 
    b c 
a 
1 2 NaN 
1 3 NaN 
2 4 NaN 
1 NaN 5 
2 NaN 6 

我想保留来自df1的重复索引,并使用df2中的重复值填充它们,但是在pandas 0.13.1中,列上的内部连接会产生错误。在最近版本的熊猫concat做我想要的:

>>> pd.concat([df1, df2], axis=1, join='inner') 
    b c 
a  
1 2 5 
1 3 5 
2 4 6 

什么是最好的方式来实现我想要的结果?有没有groupby解决方案?或者,也许我不应该使用concat

+1

我会用pd.merge改为 – ZJS

+0

你运行的是什么版本的熊猫?我正在运行'0.14.0' – EdChum

回答

3

可以进行合并,并把params从LHS和RHS使用索引:

In [4]:  
df1.merge(df2, left_index=True, right_index=True) 
Out[4]: 
    b c 
a  
1 2 5 
1 3 5 
2 4 6 

[3 rows x 2 columns] 

的毗连应该已经工作,它的工作对我来说:

In [5]: 

pd.concat([df1,df2], join='inner', axis=1) 
Out[5]: 
    b c 
a  
1 2 5 
1 3 5 
2 4 6 

[3 rows x 2 columns] 
+0

哦,真的吗?我正在运行0.13.1。很不错,他们显然已经在0.14.0中解决了这个问题。我会在升级前后测试您的解决方案,然后在完成后接受。谢谢! – andbeonetraveler

+0

好吧,合并工作在0.13.1和0.14.0,所以谢谢你的解决方案。 Concat给了我0.13.1中'不能从重复索引中重新索引'的错误,而在0.14.0中我得到:'ValueError:传递值的形状是(2,5),索引暗示(2,3)'。我想知道为什么...?我正在运行Python 3.3.5。 – andbeonetraveler

+0

@andbeonetraveler不知道我正在运行numpy 1.8.1和python 64位3.3 – EdChum