2017-08-09 33 views
2

我有兩個數據框:fpmreal。請參見下面的示例:熊貓外部合併返回的位置值和額外的Nans

  month fpm   region_id 
94934  11 3.106522e+07 5300108 
94935  23 3.476453e+07 5300108 
94936  35 4.480962e+07 5300108 
94937  47 4.148533e+07 5300108 
94938  59 4.324909e+07 5300108 
94939  71 5.908792e+07 5300108 
94940  83 6.218772e+07 5300108 
94941  95 6.881312e+07 5300108 

     region_id month gdp_region 
72397 5300108  35 5.390220e+10 
72398 5300108  47 5.845612e+10 
72399 5300108  59 6.707650e+10 
72400 5300108  71 7.573268e+10 
72401 5300108  83 8.466141e+10 
72402 5300108  95 9.340400e+10 

我想region_idmonth合併它們。

爲了做到這一點,我用命令:

j = pd.merge(real, fpm, how='outer', on=['region_id', 'month'], left_index='off', right_index='off') 

什麼情況是,從fpm列一些外來值加入的region_id 5300108同一行與實際gdp_region在正確region_id實際上並沒有加入和month

我已經檢查過兩列是同一類型的:int

這是錯誤的結果。注意INDEXES是不同的。我明確表示設置了index='off'

region_id month gdp_region   fpm 
72397 5300108  35 5.390220e+10 1.649367e+07 
72398 5300108  47 5.845612e+10 1.968157e+07 
72399 5300108  59 6.707650e+10 2.088269e+07 
72400 5300108  71 7.573268e+10 4.027545e+06 
72401 5300108  83 8.466141e+10 1.197713e+06 
72402 5300108  95 9.340400e+10 1.383501e+06 
72403 5300108 107 1.102996e+11 1.718117e+06 
72404 5300108 119 1.243238e+11 1.827867e+06 
72405 5300108 131 1.441741e+11 2.053814e+06 
72406 5300108 143 1.545690e+11 2.597804e+06 
72407 5300108 155 1.641013e+11 2.908494e+06 
72408 5300108 167 1.759067e+11 3.394452e+06 
72409 5300108 179 1.974321e+11 4.022392e+06 
94934 5300108  11   NaN 3.106522e+07 
94935 5300108  23   NaN 3.476453e+07 
94936 5300108  35   NaN 4.480962e+07 
94937 5300108  47   NaN 4.148533e+07 
94938 5300108  59   NaN 4.324909e+07 
94939 5300108  71   NaN 5.908792e+07 
94940 5300108  83   NaN 6.218772e+07 
94941 5300108  95   NaN 6.881312e+07 

感謝您的任何建議。 謝謝。

+1

'pd.merge(真實的,FPM,如何= '左',就= [ 'REGION_ID', '月'])' – Wen

+0

如果我用怎樣= '左' 我失去的信息例如,我有11個月的'fpm'。 –

+0

然後用'how''right'' – Wen

回答

1

具有可重複輸入的片段會有所幫助。你想要的輸出也一樣。你可以先用left_index = False,而不是「關」試試這個:

import pandas as pd 

fpm = pd.DataFrame({'idx':[94934,94935,94936,94937,94938,94939,94940, 94941], 
        'month': [11,23,35,47,59,71,83,95], 
        'fpm': [3.106522e+07,3.476453e+07,4.480962e+07, 4.148533e+07, 4.324909e+07, 5.908792e+07,6.218772e+07,6.881312e+07], 
        'region_id':[5300108,5300108,5300108,5300108,5300108,5300108,5300108,5300108]}) 
fpm = fpm.set_index(['idx']) 

real = pd.DataFrame({'idx':[72397,72398,72399,72400,72401,72402], 
        'region_id':[5300108,5300108,5300108,5300108,5300108,5300108], 
        'month':[35,47,59,71,83,95], 
        'gdp_region':[5.390220e+10,5.845612e+10,6.707650e+10,7.573268e+10,8.466141e+10,9.340400e+10]}) 

real = real.set_index(['idx']) 

j = pd.merge(real, fpm, how='outer', on=['region_id', 'month'], left_index=False, right_index=False).sort_values(['region_id', 'month']) 
print(j) 

這是否代表你想要的輸出?

enter image description here

+1

有趣的是,你的實現代表了期望的輸出。但是,這不是我的實際數據。我想這意味着問題不在合併命令中,而是在DataFrames的數據中的某個地方? –

+1

哇。去搞清楚。現在我做了'd = real','e = fpm'和'f = pd.merge(d,e,how ='outer',on = ['region_id','month'])'謝謝。雖然我仍然不明白爲什麼它沒有任何好的答案。它在生成DataFrame時必定是個問題。也許。 –

+0

事實上,變量的類型必須匹配!這是關鍵。 –

2

嘗試一些簡單的像這樣,

j = real.merge(fpm, how = 'right', on = ['region_id', 'month']) 

由於pandas document提到,「如果加入的列列,數據幀索引將被忽略。否則,如果對一列或多列,在加入對索引或索引的索引索引將被傳遞「。

+0

正如我所說的(上面的評論),結果框架沒有fpm的信息,我沒有gdp_region(例如在第11個月)。因此,我失去了信息。我想要一個儘可能完整的表格,儘管'Nan'在那裏我的信息實際上從原始數據庫中缺失 –

+0

@BFurtado嘗試'how ='outer'',你會得到'NaN'值,這就是是你的預期輸出。 –

+0

這正是我在示例中所做的。但看到結果是不正確的。南非人很好。但是同一月份和region_id對於fpm –

2

對於近似對稱的解決方案,其中的月份是在同一順序無論哪個撤併你執行,你可以使用(幾乎)等價表達式:

j = fpm.merge(real, how = 'outer', on = ['region_id', 'month']).sort_values('month') 

j2 = real.merge(fpm, how = 'outer', on = ['region_id', 'month']).sort_values('month') 

j3 = pd.merge(real, fpm, how = 'outer', on = ['region_id', 'month']).sort_values('month') 

請注意,left_index='off'之類不它是如何得到熊貓的支持的。它使用布爾值,其默認值設置爲False,這正是您想要的行爲。

它返回給我:

month   fpm region_id gdp_region 
0  11 31065220.0 5300108   NaN 
1  23 34764530.0 5300108   NaN 
2  35 44809620.0 5300108 5.390220e+10 
3  47 41485330.0 5300108 5.845612e+10 
4  59 43249090.0 5300108 6.707650e+10 
5  71 59087920.0 5300108 7.573268e+10 
6  83 62187720.0 5300108 8.466141e+10 
7  95 68813120.0 5300108 9.340400e+10 

如果這不是你的結果,那麼很可能,有一個名爲您的數據幀「FPM」稱爲「真正的」一個額外的列。但是,我可以通過設置left_index=True, right_index=True來重新創建原始問題,所以我認爲使用「off」的關鍵字定義使python解釋了布爾值True而不是所需的行爲。現在

,使用left_index=True會填滿,因爲與過去已知的索引值的數據長度差的失蹤指標:

j4 = pd.merge(fpm, real, how = 'outer', on = ['region_id', 'month'], left_index=True, right_index=False).sort_values('month') 
      month   fpm region_id gdp_region 
72402  11 31065220.0 5300108   NaN 
72402  23 34764530.0 5300108   NaN 
72397  35 44809620.0 5300108 5.390220e+10 
72398  47 41485330.0 5300108 5.845612e+10 
72399  59 43249090.0 5300108 6.707650e+10 
72400  71 59087920.0 5300108 7.573268e+10 
72401  83 62187720.0 5300108 8.466141e+10 
72402  95 68813120.0 5300108 9.340400e+10 

其他的方式,該指數被保留:

j5 = pd.merge(fpm, real, how = 'outer', on = ['region_id', 'month'], left_index=False, right_index=True).sort_values('month') 
     month   fpm region_id gdp_region 
94934  11 31065220.0 5300108   NaN 
94935  23 34764530.0 5300108   NaN 
94936  35 44809620.0 5300108 5.390220e+10 
94937  47 41485330.0 5300108 5.845612e+10 
94938  59 43249090.0 5300108 6.707650e+10 
94939  71 59087920.0 5300108 7.573268e+10 
94940  83 62187720.0 5300108 8.466141e+10 
94941  95 68813120.0 5300108 9.340400e+10 

而且使用兩者作爲True將只使用所有的索引值組合,並且最終得到大量的NaN,或者如果您有實際的數據,則填充該特定索引值組合的值:

j6 = pd.merge(fpm, real, how = 'outer', on = ['region_id', 'month'], left_index=True, right_index=True).sort_values('month') 
     month   fpm region_id gdp_region 
94934  11 31065220.0 5300108   NaN 
94935  23 34764530.0 5300108   NaN 
72397  35   NaN 5300108 5.390220e+10 
94936  35 44809620.0 5300108   NaN 
72398  47   NaN 5300108 5.845612e+10 
94937  47 41485330.0 5300108   NaN 
72399  59   NaN 5300108 6.707650e+10 
94938  59 43249090.0 5300108   NaN 
72400  71   NaN 5300108 7.573268e+10 
94939  71 59087920.0 5300108   NaN 
72401  83   NaN 5300108 8.466141e+10 
94940  83 62187720.0 5300108   NaN 
72402  95   NaN 5300108 9.340400e+10 
94941  95 68813120.0 5300108   NaN