pandas从多源DataFrame匹配数据为初始表新增列的实现方法
实现方法
有两种常用方案都可以实现需求,你可以根据自己的数据量大小和数据特征选择:
方案1:宽表转长表合并法(适合数据量较大、无重复匹配键的场景)
核心逻辑是把按年份存为列的宽表df1、df2转换为country、yeardum为联合主键的长表,再和df0按主键合并,代码如下:
import pandas as pd # 你已有的df0、df1、df2定义代码这里省略,直接运行后续逻辑 # 处理df1转长表 df1_long = df1.melt( id_vars='country', var_name='yeardum', value_name='sales_year_data' ) # 合并销售数据到df0 df_inv = df0.merge(df1_long, on=['country', 'yeardum'], how='left') # 处理df2转长表 df2_long = df2.melt( id_vars='country', var_name='yeardum', value_name='country_image_data' ) # 合并国家印象数据,存在重复匹配时默认保留第一条 df_inv = df_inv.merge(df2_long, on=['country', 'yeardum'], how='left').drop_duplicates(keep='first')
方案2:逐行匹配法(适合数据量小、匹配规则灵活的场景)
直接对df0逐行遍历,匹配df1、df2的对应位置取值,逻辑简单不易出错:
df_inv = df0.copy() # 匹配sales_year_data列 df_inv['sales_year_data'] = df_inv.apply( lambda row: df1.loc[df1['country'] == row['country'], row['yeardum']].iloc[0], axis=1 ) # 匹配country_image_data列 df_inv['country_image_data'] = df_inv.apply( lambda row: df2.loc[df2['country'] == row['country'], row['yeardum']].iloc[0], axis=1 )
运行上述任意一种方案的代码后,得到的df_inv就是你需要的目标结果。
内容的提问来源于stack exchange,提问作者mlosada
相关产品推荐
相关产品推荐

