2016-02-08 83 views
1
多发性列

想象我有熊猫以下DataFrames:如何避免Pandas.Merge

In [7]: A= pd.DataFrame([['foo'],['bar'],['quz'],['baz']],columns=['key']) 

In [8]: A['value'] = 'None' 

In [9]: A 
Out[9]: 
    key value 
0 foo None 
1 bar None 
2 quz None 
3 baz None 

In [10]: B = pd.DataFrame([['foo',5],['bar',6],['quz',7]],columns= ['key','value']) 

In [11]: B 
Out[11]: 
    key value 
0 foo  5 
1 bar  6 
2 quz  7 

In [12]: pd.merge(A,B, on='key', how='outer') 
Out[12]: 
    key value_x value_y 
0 foo None  5 
1 bar None  6 
2 quz None  7 
3 baz None  NaN 

但我要的是(基本上避免了重复列):

key value 
0 foo 5 
1 bar 6 
2 quz 7 
3 baz NaN 

我猜想我可以把输出并删除_x值,并重新命名_y但是,似乎是矫枉过正。在SQL上这将是微不足道的。

编辑:

约翰为recomended使用:

In [1]: A.set_index('key', inplace=True) 
     A.update(B.set_index('key'), join='left', overwrite=True) 
     A.reset_index(inplace=True) 

这工作和做什么,我提出的要求。

+0

的可能的复制[?如何更新大熊猫现有数据帧(http://stackoverflow.com/questions/18726497/how:

第二溶液还可以与更新的索引使用-to-更新现有的数据帧功能于熊猫) – root

+0

@root它们是类似的问题,但是这个问题专门询问如何键列上结合起来。 – johnchase

+0

@johnchase:我挂的问题,专门用一个键列合并交易,实际上是在更普遍的,因为它有两个键列,而不是一个交易。同样的方法适用于在单个键列上组合。查看接受答案的编辑。 – root

回答

1

在你合并两个dataframes与同一列的例子,一个包含字符串(“无”)的其它整数,大熊猫不知道你要保留,哪些应该被替换的列值,因此它创建两个列。

您可以使用update代替

In [10]: A.update(B, join='left', overwrite=True) 
In [11]: A 
Out[11]: 

    key value 
0 foo 5 
1 bar 6 
2 quz 7 
3 baz NaN 

另一种解决方案是只注明您要为给定列的值:

In [15]: A.loc[B.index, 'value'] = B.value 
In [16]: A 
Out[16]: 

    key value 
0 foo 5 
1 bar 6 
2 quz 7 
3 baz NaN 

个人而言,我倾向于第二种方案,因为我很清楚发生了什么,但第一个可能更接近你在你的问题中寻找的东西。

编辑:

如果指数不匹配,我不太清楚如何做到这一点。因此,我建议让他们匹配:

In [1]: A.set_index('key', inplace=True) 
     A.update(B.set_index('key'), join='left', overwrite=True) 
     A.reset_index(inplace=True) 

这可能是因为有更好的方式来做到这一点,但我不相信,大熊猫必须彻底执行此操作的一种方式。

In [24]: A.set_index('key', inplace=True) 
     A.loc[B.key, 'value'] = B.value.tolist() 
+0

感谢约翰。在我的例子中,索引匹配(即两种情况下,foo的索引都是0)。如果情况并非如此,我必须加入Key而不是Index? – Yona

+0

仅供参考,为您的“编辑”使用的更新功能工作正常,但该方法的.loc没有(至少我的完整数据集)。 – Yona

+0

@Yona用'.loc'查看方法的最近编辑。它看起来有点不同,'tolist()'方法需要被调用来忽略索引 – johnchase