2017-10-20 4 views
1

J'ai deux dataframes et j'ai besoin de séparer les lignes où une valeur de pmdf correspond à l'un des codes de jcrdf.All_codes .Python/Pandas: combiner les colonnes de 2 données basées sur la correspondance des valeurs entre les colonnes, mais ne peut pas utiliser la fusion

Si pmdf.code est dans jcrdf.All_codes, j'ai besoin d'une base de données avec toutes les valeurs de 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']       
     }) 

j'ai une recherche qui permet une diff:

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])] 

Mais je ne peux pas comprendre comment inclure pmdf.count.

J'ai essayé de faire une df des codes uniques des correspondances, mais peu importe ce que ces valeurs doivent être dans jcfdf.All_codes.

Merci d'avance, comme d'habitude, pour toute assistance.

Répondre

1

Une façon serait d'élargir la colonne jcrdf All_codes puis utiliser Merge

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

Vous obtenez

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 

Si vous souhaitez que les données dans le format d'origine

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

Nous vous remercions de ce. Donc, dans la sortie finale, les valeurs sous "code" sont-elles simplement les codes qui correspondent de pmdf à jcrdf.All_codes? – mattrweaver

+1

@mattrweaver, oui ce sont les codes qui correspondent – Vaishali