熊猫:匹配两个具有不同索引的数据帧

时间:2017-01-16 17:57:21

标签: python pandas

考虑两个数据帧:

>>> X = pd.DataFrame(np.arange(0,12).reshape(4,3),columns=['a','b','c'])
>>> X
   a   b   c
0  0   1   2
1  3   4   5
2  6   7   8
3  9  10  11
>>> 
>>> Y = pd.DataFrame(np.array([['abc',22],['fgh',44],['ijk',0],['xee',99],['RGD',3]]),columns = ['x','y'])
>>> Y
     x   y
0  abc  22
1  fgh  44
2  ijk   0
3  xee  99
4  RGD   3

我想以某种方式加入这两个数据帧,以便得到结果

   a   b   c
0  ijk 1  2
1  RGD 4   5
2  6   7   8
3  9  10  11

我尝试了以下内容:

    >>> X.loc[X['a'].astype(str).isin(Y['y']),'a']=Y[Y['y'].astype(str).isin(X['a'])]
>>> X
     a   b   c
0  nan   1   2
1  nan   4   5
2 6.00   7   8
3 9.00  10  11

我认为它正试图通过索引来匹配它们,给我一个楠。我也试过加入X和Y,但是不能让它起作用。我认为合并这两个数据帧是可行的,但我不知道如何将它们合并到列' a'并且' y'适当

此处的任何提示都将非常感谢

1 个答案:

答案 0 :(得分:4)

您可以使用mapa中的X替换为x中的Y(如果存在),否则保留原始值:

X['a'] = X.a.astype(str).map(Y.set_index('y').x).fillna(X.a)

enter image description here

另一个合并选项,(我更正了Y中的数据类型,即假设y列是浮点而不是字符串):

X = pd.DataFrame(np.arange(0,12).reshape(4,3),columns=['a','b','c'])
Y = pd.DataFrame([['abc',22],['fgh',44],['ijk',0],['xee',99],['RGD',3]],columns = ['x','y'])

然后xa列上的合并产生:

mX = X.merge(Y.set_index("y"), left_on="a", right_index=True, how="left")
mX

enter image description here

然后取决于您的需要,您可以将列ax组合在一起,或者将它们保留为我认为实际上更合理的列:

要合并a和x列,您可以执行以下操作:

mX.assign(a = mX.x.fillna(mX.a)).drop('x', axis=1)

这与第一个选项的结果相同。