2014-10-30 24 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')