【问题标题】:pandas merge produce duplicate columns熊猫合并产生重复的列
【发布时间】:2017-11-14 22:28:12
【问题描述】:
n1 = DataFrame({'zhanghui':[1,2,3,4] , 'wudi':[17,'gx',356,23] ,'sas'[234,51,354,123]  })
n2 = DataFrame({'zhanghui_x':[1,2,3,5] , 'wudi':[17,23,'sd',23] ,'wudi_x':[17,23,'x356',23] ,'wudi_y':[17,23,'y356',23] ,'ddd':[234,51,354,123]  })

上面的代码定义了两个 DataFrame 对象。我想使用 n1 中的“zhanghui”字段和 n2 中的“zhanghui_x”字段作为“on”字段合并 n1 和 n2,所以我的代码如下:

n1.merge(n2,how = 'inner',left_on = 'zhanghui',right_on='zhanghui_x') 

然后给出这样的结果列:

sas     wudi_x  zhanghui    ddd     wudi_y  wudi_x  wudi_y  zhanghui_x

出现了一些重复的列,例如“wudi_x”、“wudi_y”。 所以这是熊猫内部的问题,还是我对 pd.merge 的用法有误?

【问题讨论】:

  • 请发布所需的输出,这是预期的行为,因为您的行值不相同,因此它将冲突的值添加为新的 x 和 y 列

标签: pandas merge duplicates


【解决方案1】:

您的方法是正确的,pandas 在将“重复”的列与给定 postscript _x、_y 等的原始标题合并后自动给出 postscript。

您可以先选择要合并的列并继续:

cols_to_use = n2.columns - n1.columns
n1.merge(n2[cols_to_use],how = 'inner',left_on = 'zhanghui',right_on='zhanghui_x') 

结果列:

sas wudi    zhanghui    ddd wudi_x  wudi_y  zhanghui_x

【讨论】:

    【解决方案2】:

    当我尝试运行 cols_to_use = n2.columns - n1.columns 时,它给了我这样的 TypeError:

    cannot perform __sub__ with this index type: <class pandas.core.indexes.base.Index'>
    

    然后我尝试使用下面的代码:

    cols_to_use = [i for i in list(n2.columns) if i not in list(n1.columns) ]
    

    效果很好,结果列如下所示:

    sas  wudi   zhanghui    ddd wudi_x  wudi_y  zhanghui_x
    

    所以,@S Ringne 的方法确实解决了我的问题。

    ==============================================

    Pandas 在合并两个 Frame 对象时只需添加诸如“_x”之类的后缀即可解决重复列名问题。

    但是如果'a-column-name'+'_x'的名字形式出现在任意一个Frame对象中会怎样呢?我曾经以为它会检查名字形式是否'a-column-name'+'_x' 出现,但实际上pandas没有这个检查?

    【讨论】:

      【解决方案3】:

      根据 pandas 文档,merge() 函数具有以下属性;

      pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None,
           left_index=False, right_index=False, sort=True,
           suffixes=('_x', '_y'), copy=True, indicator=False,
           validate=None)
      

      其中 suffixes 表示要附加到具有默认值 '_x''_y' 的“重叠”列的默认后缀字符串。

      我不确定我是否正确理解了您的后续问题,但是;

      #case1
      如果第一个数据帧的列 'column_name_x' 和第二个数据帧的列 'column_name' 则没有重叠的列,因此没有附加后缀。

      #case2
      如果第一个 dataFrame 有列 'column_name''column_name_x' 并且第二个 dataFrame 也有列 'column_name',则默认后缀附加到列重叠,因此第一帧的 'columnn_name' 变为 'column_name_x' 并导致与现有列重复。

      但是,您可以将 None 值传递给一个(不是全部)后缀,以确保某些 dataFrame 的列名保持原样。

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 2019-12-15
        • 2020-10-27
        • 1970-01-01
        • 1970-01-01
        • 2021-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多