【问题标题】:Pandas join issue: columns overlap but no suffix specified熊猫加入问题:列重叠但未指定后缀
【发布时间】:2014-12-26 01:15:34
【问题描述】:

我有以下数据框:

print(df_a)
     mukey  DI  PI
0   100000  35  14
1  1000005  44  14
2  1000006  44  14
3  1000007  43  13
4  1000008  43  13

print(df_b)
    mukey  niccdcd
0  190236        4
1  190237        6
2  190238        7
3  190239        4
4  190240        7

当我尝试加入这些数据框时:

join_df = df_a.join(df_b, on='mukey', how='left')

我得到错误:

*** ValueError: columns overlap but no suffix specified: Index([u'mukey'], dtype='object')

为什么会这样?数据框确实有共同的'mukey' 值。

【问题讨论】:

    标签: python join pandas


    【解决方案1】:

    您发布的数据的 sn-p 错误有点神秘,因为没有公共值,连接操作会失败,因为值不重叠它需要您提供左侧的后缀和右手边:

    In [173]:
    
    df_a.join(df_b, on='mukey', how='left', lsuffix='_left', rsuffix='_right')
    Out[173]:
           mukey_left  DI  PI  mukey_right  niccdcd
    index                                          
    0          100000  35  14          NaN      NaN
    1         1000005  44  14          NaN      NaN
    2         1000006  44  14          NaN      NaN
    3         1000007  43  13          NaN      NaN
    4         1000008  43  13          NaN      NaN
    

    merge 有效,因为它没有这个限制:

    In [176]:
    
    df_a.merge(df_b, on='mukey', how='left')
    Out[176]:
         mukey  DI  PI  niccdcd
    0   100000  35  14      NaN
    1  1000005  44  14      NaN
    2  1000006  44  14      NaN
    3  1000007  43  13      NaN
    4  1000008  43  13      NaN
    

    【讨论】:

      【解决方案2】:

      .join() 函数正在使用作为参数数据集传递的index,因此您应该使用set_index 或改用.merge 函数。

      请找出两个适合你的例子:

      join_df = LS_sgo.join(MSU_pi.set_index('mukey'), on='mukey', how='left')
      

      join_df = df_a.merge(df_b, on='mukey', how='left')
      

      【讨论】:

      • 我想补充一点,set_index 必须应用于双方,然后它比merge 大大提高了性能。
      【解决方案3】:

      此错误表明两个表有 1 个或多个列名具有相同的列名。错误消息转换为:“我可以在两个表中看到相同的列,但您没有告诉我在将其中一个放入之前重命名”

      您要么想在使用 del df['column name'] 将其中一列从另一列引入之前删除它,要么使用 lsuffix 重写原始列,或使用 rsuffix 重命名当前列带来了。

      df_a.join(df_b, on='mukey', how='left', lsuffix='_left', rsuffix='_right')
      

      【讨论】:

        【解决方案4】:

        错误表示两个表有1个或多个列名相同的列名。

        遇到相同错误且不想提供后缀的任何人都可以改为重命名列。如果您不想提供 on='mukey' 设置,还要确保两个 DataFrame 的索引在类型和值上匹配。

        # rename example
        df_a = df_a.rename(columns={'a_old': 'a_new', 'a2_old': 'a2_new'})
        # set the index
        df_a = df_a.set_index(['mukus'])
        df_b = df_b.set_index(['mukus'])
        
        df_a.join(df_b)
        

        【讨论】:

          【解决方案5】:

          主要join是专门用于基于索引的join,而不是属性名,所以在两个不同的dataframe中改变属性名,然后尝试join,它们会被join,否​​则会出现这个错误

          【讨论】:

            猜你喜欢
            • 2021-05-11
            • 1970-01-01
            • 2022-01-04
            • 2018-02-28
            • 2023-02-26
            • 1970-01-01
            • 2016-11-05
            • 2014-09-21
            • 1970-01-01
            相关资源
            最近更新 更多