You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于后缀值合并无共同列的两个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对应关系。

解决方案

可以通过分步匹配+列重组实现需求,以下两种方法都能达到目标:

方法一:分步合并后拼接

  1. 先给df2指定列名(若导入时未设置):
import pandas as pd

# 假设df2导入后无列名,手动指定
df2.columns = ['code', 'value']
  1. 分别将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的实际列名

  1. 提取目标列拼接成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:20:42