大熊猫合并:在同一列上合并两个数据框,但保留不同的列

时间:2018-07-02 03:33:23

标签: python pandas dataframe

我有两个共享一个公共列名的pandas dataFrames。我想合并公共列名称,但保留第二个dataFrame中所有不同的列,其中第二个dataFrame的公共列名称匹配。这是两个dataFrames的示例:

DF1:
    A      B      C     D     E      F      G     H
    value value   value value value value  value value
    value value   value value value value  value value
    value value   value value value value  value value
    etc.


DF2:
      A     I     J     K     L
    value value value value value
    value value value value value
    value value value value value

我希望预期的结果是:

Result:

      A      B       C     D     E     F      G     H     I     J     K     L
    value  value   value value value value  value value value value value value
    value  value   value value value value  value value value value value value
    value  value   value value value value  value value value value value value

也就是说,在“ A”列上存在匹配项的地方,我希望保留I,J,K,L的行,但不等于“ NaN”,这与DF1中的列类似。

我已经尝试了所有的pd.merge选项,但它们似乎并没有按照我在上面的要求进行操作。例如,

pd.merge(DF1, DF2, on='A', how='left') 

与'A'匹配,并将所有键保留在左侧,但不保留在第二个dataFrame中。我知道这是应该执行的操作,但这不是我想要的。同样,how ='right'的功能相同,但是保留了右侧的所有键,并用'NaNs'填充了左侧的所有键。 “外部”似乎也没有做我想要的事情,因为它只是将所有内容粘在一起,并用NaN填充所有非相似列。

此外,请注意DF1和DF2的索引顺序不同。

有人可以在这里为我提供前进的道路吗?谢谢!

1 个答案:

答案 0 :(得分:1)

如果有

设置

z=io.StringIO("""    A      B      C     D     E      F      G     H
    value2 value2   value2 value2 value2 value2  value2 value2
    value3 value3   value3 value3 value3 value3  value3 value3
    value value   value value value value  value value""")

df = pd.read_table(z, delim_whitespace=True)

z2=io.StringIO("""      A     I     J     K     L
    value value value value value
    value2 value2 value2 value2 value2
    value3 value3 value3 value3 value3""")

df2=pd.read_table(z2,delim_whitespace=True)

然后

pd.merge(df,df2, on="A",right_index=True, left_index=True)


    A       B       C       D       E       F       G       H       I       J       K       L
0   value   value   value   value   value   value   value   value   value   value   value   value
1   value   value   value   value   value   value   value   value   value   value   value   value
2   value   value   value   value   value   value   value   value   value   value   value   value

要匹配您所描述的索引,

pd.merge(df.set_index("A"),df2.set_index("A"), right_index=True, left_index=True).reset_index()

    A       B       C       D       E       F       G       H      I        J       K       L
0   value2  value2  value2  value2  value2  value2  value2  value2  value2  value2  value2  value2
1   value3  value3  value3  value3  value3  value3  value3  value3  value3  value3  value3  value3
2   value   value   value   value   value   value   value   value   value   value   value   value