pandas 如何连接两个 Dataframe 并填充一个列?

bn31dyow  于 2023-06-04  发布在  其他
关注(0)|答案(3)|浏览(160)

我有两个 Dataframe 如下,

DF1                                 
Name;ID;Course;SID;Subject          
Alex;A1;Under;;chemistry            
Oak;A2;Under;;chemistry             
niva;A3;grad;;physics               
mark;A4;Under;;Med

DF2
PID;ServiceId;Address;Active
A1;svc1;WI;Yes
A2;svc2;MI;Yes
A3;svc2;OH;Yes

我希望使用ID和PID列从DF2.ServiceId填充SID的 Dataframe 。预期输出如下

DF3                     
Name;ID;Course;SID;Subject        
Alex;A1;Under;svc1;chemistry            
Oak;A2;Under;svc2;chemistry            
niva;A3;grad;svc3;physics   
mark;A4;Under;;Med

我尝试了下面的,但它显示了来自两个 Dataframe 的所有列。

DF3 = DF1.merge(DF2, how='inner', left_on="ID", right_on="PID")
mklgxw1f

mklgxw1f1#

这似乎是一个简单的合并得到的答案。尝试在合并中使用how="left",因为您希望填充第一个 Dataframe DF1(即在合并之前保留 Dataframe 中的所有其它值相同)。

DF1.merge(DF2, left_on="ID", right_on="PID", how='left').drop('SID', axis=1).rename(columns={'ServiceId':'SID'})

我已经做了一些rename来获得确切的列名。
奥普特

Name  ID Course    Subject  PID   SID Address Active
0  Alex  A1  Under  chemistry   A1  svc1      WI    Yes
1   Oak  A2  Under  chemistry   A2  svc2      MI    Yes
2  niva  A3   grad    physics   A3  svc2      OH    Yes
3  mark  A4  Under        Med  NaN   NaN     NaN    NaN
s1ag04yj

s1ag04yj2#

看起来最直接的方法是根据df1['ID']df2['PID']重新索引df2['ServiceId'](实际上是连接),然后将结果值分配给SID。不过,我觉得有更简洁的写法。

df1.assign(SID=df2.set_index('PID')['ServiceId'].reindex(df1['ID']).values)
Name  ID Course   SID    Subject
0  Alex  A1  Under  svc1  chemistry
1   Oak  A2  Under  svc2  chemistry
2  niva  A3   grad  svc3    physics
3  mark  A4  Under   NaN        Med
3ks5zfa0

3ks5zfa03#

您可以使用pandasql并执行SQL左连接。

import pandasql as pdsql

query = '''
SELECT DF1.Name, DF1.ID, DF1.Course, DF2.ServiceId as SID, DF1.Subject
FROM DF1
LEFT JOIN
     DF2
ON DF1.ID = DF2.PID
'''

DF3 = pdsql.sqldf(query)
Name  ID Course       SID    Subject
0  Alex  A1  Under      svc1  chemistry
1   Oak  A2  Under      svc2  chemistry
2  niva  A3   grad      svc3    physics
3  mark  A4  Under      None        Med

如果在执行此查询时收到Object Not Executable Error: Not an executable object错误,请检查您的pandasqlsqlalchemy版本。您可能需要专门安装sqlalchemy-1.4.46,因为目前pandasql-0.7.3和sqlalchemy-2.0.15有一个bug。

相关问题