2014-10-30 22 views
55

我有以下2个数据帧:熊猫加盟问题:列重叠,但没有后缀指定

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 

df_b = 
    mukey niccdcd 
0 190236  4 
1 190237  6 
2 190238  7 
3 190239  4 
4 190240  7 

当我尝试加入这些2个dataframes:

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

我得到的错误:

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

这是为什么呢?数据帧确实具有通用的'mukey'值。

+1

的错误是有点神秘,这里的问题是,你有没有值是共同执行连接上,如果你这样做,将被罚款:'LS_sgo.merge(MSU_pi,上=” mukey',how ='left')' – EdChum 2014-10-30 08:35:46

+1

我确实在2'mukey'列中有共同的值,只是不在所示的数据框的小部分。在excel中加入它们确实有效,但似乎并不像熊猫似的......有什么办法可以提供更多信息来帮助查明这个问题吗? – user308827 2014-10-30 13:06:14

+0

你必须发布你的原始数据,你也尝试合并? – EdChum 2014-10-30 13:07:48

回答

62

您发布的数据片段中的错误有点含糊不清,因为没有共同的值,连接操作失败,因为值不重叠,所以需要您提供左右后缀右手边:

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 
+0

谢谢!这个作品... – user308827 2014-10-30 13:28:31

+0

什么参数将允许左连接带来只匹配正确的数据帧键?例如,我拥有931条记录的df1。 df2有153,000条记录。只有来自df2的21条记录应该与df1匹配,并且当df1和df2被合并时,我应该只接收来自左边数据框(df1)的931条记录。然而,我最终得到了935分。 – david 2016-02-18 14:22:03

+1

@大卫这可能意味着你在DF1或DF2 – EdChum 2016-02-18 14:27:45

8

.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')

3

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

您可能希望在将其中一列之前删除从另一方面使用del df ['列名'],或者使用lsuffix重写原始列,或者使用rsuffix重命名正在提交的列。

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