如何基于后缀值合并无共同列的两个Pandas DataFrame?
问题
我有两个从CSV文件导入的DataFrame:
df1(结构示例):
1, 204c, 204s 2, 205c, 205s 3, ..., ...
df2(结构示例):
204c, 1000 205c, 3000 ..., ... ..., ... 204s, 4000 205s, 5000
我希望基于末尾的c、s值将df2合并到df1,得到如下结构的df3:
204c, 1000, 204s, 4000 205c, 3000, 205s, 5000
试过df1.merge(df2, how='cross')得到全量笛卡尔积,不符合预期;用pd.concat([df1,df2], axis=1)又会出现NaN,没正确匹配c/s对应关系。
解决方案
可以通过分步匹配+列重组实现需求,以下两种方法都能达到目标:
方法一:分步合并后拼接
- 先给df2指定列名(若导入时未设置):
import pandas as pd # 假设df2导入后无列名,手动指定 df2.columns = ['code', 'value']
- 分别将df1的c列、s列与df2匹配,提取对应数值:
# 匹配c列对应的value df_c = df1.merge(df2, left_on='你的c列名', right_on='code', how='left').rename(columns={'value': 'c_value'}) # 匹配s列对应的value df_s = df1.merge(df2, left_on='你的s列名', right_on='code', how='left').rename(columns={'value': 's_value'})
注:把你的c列名和你的s列名替换成df1中对应204c、204s的实际列名
- 提取目标列拼接成df3:
df3 = pd.concat([ df_c['你的c列名'], df_c['c_value'], df_s['你的s列名'], df_s['s_value'] ], axis=1)
方法二:字典映射法(更高效)
直接把df2转成字典,通过映射快速匹配数值,适合数据量较大的场景:
# 将df2转为code:value的字典 code_value_map = df2.set_index('code')['value'].to_dict() # 给df1新增c、s对应的数值列 df1['c_value'] = df1['你的c列名'].map(code_value_map) df1['s_value'] = df1['你的s列名'].map(code_value_map) # 提取需要的列组成目标df3 df3 = df1[['你的c列名', 'c_value', '你的s列名', 's_value']]
两种方法最终输出的df3都会和你期望的结构一致。
内容的提问来源于stack exchange,提问作者Jackson tse
相关产品推荐
相关产品推荐

