当前位置: 首页 > 知识库问答 >
问题:

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

朱皓
2023-03-14

我有两个熊猫数据帧共享一个共同的列名。我想合并公共列名,但保留与第二个dataFrame中的所有不同列,其中公共列名称匹配。下面是两个数据帧的示例:

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”上匹配并将所有键保留在左侧,但不是来自第二个数据帧。我知道这是它应该做的,但这不是我想要的。类似地,如何='right'也做了同样的事情,但保留了右侧的所有键,并用“NaN”填充左侧的所有键。“外部”似乎也没有做我想要的,因为它只是将所有内容粘在一起并用NaN填充所有不相似的列。

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

有人能给我提供一条前进的道路吗?谢谢!

共有1个答案

谷梁建中
2023-03-14

如果您有

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
 类似资料:
  • 我肯定错过了一些简单的东西。尝试合并熊猫中的两个数据帧,它们的列名基本相同,但右边的数据帧有一些左边没有的列,反之亦然。 我已尝试使用外部联接进行联接: 但这会产生: 我还指定了一个要连接的列(例如,on="id"),但这会重复所有列,除了"id",如attr_1_x、attr_1_y,这并不理想。我还传递了整个列列表(有很多)到on: 其产生: 我错过了什么?我想得到一个附加了所有行的df,并且

  • 问题内容: 我正在尝试使用两列来连接两个熊猫数据框: 但出现以下错误: 任何想法应该是正确的方法吗?谢谢! 问题答案: 尝试这个 https://pandas.pydata.org/pandas- docs/stable/reference/api/pandas.DataFrame.merge.html left_on:要在左侧DataFrame中加入的标签或列表或类似数组的字段名称。可以是Dat

  • 问题内容: 我在加入熊猫方面遇到问题,并且试图找出问题所在。假设我有一个x: 我应该能够通过简单的连接命令在y = x上将y与索引上的y联接,除了同名具有+2。 我希望决赛对双方都有1941个非值。我也尝试过合并,但是我有同样的问题。 我以为正确的答案是pandas.concat([x,y]),但这也不符合我的预期。 编辑:如果您在加入方面遇到问题,请阅读下面的韦斯答案。我有一个重复的时间戳。 问

  • 我有两个不同列数和行数的CSV文件。第一个CSV文件有M列和N行,第二个文件有H列和G行。一些列具有相同的名称。 null 另外,如果两个CSV文件有两个数据帧,并希望这样做,例如,如果我将第一个CSV加载到中,将第二个加载到中,然后希望合并到,类似于上面的示例。

  • 我想将两个哈希数组合并到一个新数组中: 现在这就是我正在寻找的结果: 我在Ruby文档中唯一能找到的合并选项是用另一个散列覆盖重复项。那么如何才能达到我需要的版本呢?

  • 我目前面临着一个问题,在使用Pandas处理和操作数据帧方面,我似乎无法解决这个问题。 为了让您了解我正在谈论的数据帧以及您将在我的代码中看到的数据帧: 我正在尝试将数据集“data”的“exercise”列中的单词更改为数据集“exercise”的“name”列中的单词。 例如,数据数据集锻炼列中的首字母缩略词Dl应更改为锻炼数据集名称列中的死电梯。 我尝试过许多方法,但似乎都失败了。我每次都收