2017-10-20 60 views
1

我有兩個數據框,我需要分隔行,其中來自pmdf的值匹配jcrdf.All_codes中的代碼之一。Python /熊貓:根據列間值的匹配合並來自2個數據幀的列,但不能合併

如果pmdf.code位於jcrdf.All_codes中,我需要一個來自jcrdf AND pmdf.count的所有值的數據框。

Dataframes:

pmdf = pd.DataFrame(
     { 
     'code': ['0567-8315','0007-4977','0096-0225','1365-2133','8675-309J'], 
     'count':['6','7','10','2','1'] 
     } 
     ) 

jcrdf = pd.DataFrame(
     { 
     'jobtitle': ['manager','technician','noob','retiree'], 
     'location': ['loc1','loc3','loc4','loc2'], 
     'jcode' : ['4444-4444','3333-3333','2222-2222','1111-1111'], 
     'All_codes': ['0096-0225,0096-0225','1820-7448,0567-8315,0567-8315','0007-4977,0007-4977','0007-0963,0007-0963,0366-077X,1365-2133']       
     }) 

我有一個查找允許一個差異:

jcrdf_lookup = pd.DataFrame(jcrdf['All_codes'].str.split(',').tolist(), 
          index=jcrdf.jcode).stack(level=0).reset_index(level=0) 
matches = jcrdf_lookup[jcrdf_lookup[0].isin(pmdf.code)] 
jcrdfmatch = jcrdf[jcrdf.jcode.isin(matches.jcode)] 
jcrdfnomatch = pmdf[~pmdf.code.isin(matches[0])] 

但我無法弄清楚如何將pmdf.count。

我試着從匹配中做出唯一代碼的df,但不管那些值必須在jcfdf.All_codes中。

在此先感謝,像往常一樣,任何援助。

回答

1

一個辦法是擴大jcrdf All_codes列,然後使用合併

jcrdf_temp = jcrdf.set_index(['jcode', 'jobtitle', 'location']).All_codes.str.split(',',expand = True)\ 
.stack().reset_index(3,drop = True).reset_index(name = 'All_codes') 

new_df = pd.merge(pmdf, jcrdf_temp, left_on = 'code', right_on = 'All_codes') 

你得到

code count jcode  jobtitle location All_codes 
0 0567-8315 6 3333-3333 technician loc3 0567-8315 
1 0567-8315 6 3333-3333 technician loc3 0567-8315 
2 0007-4977 7 2222-2222 noob  loc4 0007-4977 
3 0007-4977 7 2222-2222 noob  loc4 0007-4977 
4 0096-0225 10 4444-4444 manager  loc1 0096-0225 
5 0096-0225 10 4444-4444 manager  loc1 0096-0225 
6 1365-2133 2 1111-1111 retiree  loc2 1365-2133 

如果你想在原來的格式數據

new_df = new_df.drop('All_codes', 1).groupby(['jcode', 'jobtitle', 'count', 'location']).code.apply(','.join).reset_index() 

    jcode  jobtitle count location code 
0 1111-1111 retiree  2  loc2  1365-2133 
1 2222-2222 noob  7  loc4  0007-4977,0007-4977 
2 3333-3333 technician 6  loc3  0567-8315,0567-8315 
3 4444-4444 manager  10  loc1  0096-0225,0096-0225 
+0

謝謝你這個。因此,在最終輸出中,「代碼」下的值是從pmdf到jcrdf.All_codes匹配的代碼嗎? – mattrweaver

+1

@mattrweaver,是的那些是匹配的代碼 – Vaishali