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

Posted

技术标签:

【中文标题】熊猫合并:合并同一列上的两个数据框,但保留不同的列【英文标题】:pandas merge: merge two dataframes on same column but keep different columns 【发布时间】:2018-12-10 05:57:21 【问题描述】:

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

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”并将所有键保留在左侧,但不来自第二个数据帧。我知道这是它应该做的,但这不是我想要的。类似地,how='right' 执行相同的操作,但保留右侧的所有键,并用 'NaNs' 填充左侧的所有键。 “外部”似乎也没有做我想做的事,因为它只是将所有东西粘在一起并用 NaN 填充所有不相似的列。

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

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

【问题讨论】:

【参考方案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

【讨论】:

这与我想要的很接近,但我没有提到它们在索引方面的排序不同,所以这确实保留了 I、J、K、L 并匹配 id,但是它似乎根据索引匹配 I、J、K、L,而不是“A”上的匹配。那有意义吗?我希望当数据帧之间的“A”值匹配时,它仍然保留行顺序,因此 B、C、D、E、F、G、H 似乎与“A”列正确匹配,但 I、J、 K, L 似乎与索引匹配。我会确保编辑我的问题。 @user1332577 我已经编辑了这个问题。希望这有效:) 这可以将所有内容合并在一起。我挣扎了一会儿,因为 pd.merge 需要很长时间来计算。事实证明,我需要在运行之前更改索引 dtype,否则它只会挂起。 'A' dtype 是一个对象,但它必须是 str,所以我在将索引设置为 'A' 后用 df1.index.astype(str) 和 df2.index.astype(str) 修复了它。我在 pd.merge 调用之外执行此操作,然后仅对更改的数据帧进行操作。 但是,我得到了一个有趣的结果。尽管一切都在正确的位置,但由于我没有唯一的“A”值,一些行共享一个“A”值(它们的 ID),因为它们是相关的,所以假设有 3 行具有相同的“A”值,我最终得到了 9 行,所以我合并的 dataFrame 几乎是它应该长度的三倍。想法?我想知道是否可以将其设置为仅使用 left_index 或其他东西——也许这会起作用? 没关系,我想通了。我正在展平我的一个数据框,但我不需要。这就是额外行的原因。感谢您的所有帮助!

以上是关于熊猫合并:合并同一列上的两个数据框,但保留不同的列的主要内容,如果未能解决你的问题,请参考以下文章

熊猫合并具有不同名称的列并避免重复[重复]

如何在不使用for循环的情况下合并需要提前3个月的列上的两个数据框

Pandas:如何通过保留第一个数据框的信息来合并列上的两个数据框?

如何在日期时间索引和两列上合并熊猫数据框

合并数据框以保留所有项目熊猫

如何合并字符串包含的熊猫?