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

如何通过匹配列名与列值,从另一DataFrame为pandas新增列?

问题

现有两个DataFrame,需要为df1新增SCORE列,列值来自df2,匹配规则为:

  • df1的NAME列与df2的NAME列对应
  • df1的YEAR列值对应df2的列名

示例数据:

# df1
NAME  YEAR
Anna  2002
Mary  2001
Paul  2000
Paul  2001
Mary  2002
Anna  2001
Anna  2000
Mary  2000
Paul  2002

# df2
NAME  2000  2001  2002
Anna    5     4     3
Mary    3     2     5
Paul    2     3     4

预期结果:

NAME  YEAR  SCORE
Anna  2002      3
Mary  2001      2
Paul  2000      2
Paul  2001      3
Mary  2002      5
Anna  2001      4
Anna  2000      5
Mary  2000      3
Paul  2002      4

尝试过按NAME合并两个DataFrame,但会新增三列,无法得到目标结果,希望得到简洁的解决方案。


解决方案

方法1:宽表转长表后合并

先将df2的年份列转换为行(宽表转长表),再通过NAME和YEAR与df1合并:

import pandas as pd

# 将df2转换为长格式,指定id列为NAME,年份列转为YEAR,值列为SCORE
df2_long = df2.melt(id_vars='NAME', var_name='YEAR', value_name='SCORE')
# 统一YEAR列类型(若df1的YEAR是整数,需将df2_long的YEAR转为整数)
df2_long['YEAR'] = df2_long['YEAR'].astype(int)

# 按NAME和YEAR列合并两个DataFrame
result_df = pd.merge(df1, df2_long, on=['NAME', 'YEAR'], how='left')

方法2:使用lookup函数直接匹配

利用pandas的lookup函数快速匹配对应位置的值,效率更高:

import pandas as pd

# 将df2设置NAME为索引,便于按姓名匹配
df2_indexed = df2.set_index('NAME')

# 用lookup获取对应SCORE:第一个参数是行索引值,第二个参数是列名
df1['SCORE'] = df2_indexed.lookup(df1['NAME'], df1['YEAR'].astype(str))

注意:若df1的YEAR是整数类型,需转为字符串,因为df2的列名是字符串格式的年份。

方法3:逐行处理(仅小数据量适用)

如果数据量较小,也可以用apply逐行取值,但大数据量下效率较低,不推荐:

import pandas as pd

df1['SCORE'] = df1.apply(
    lambda row: df2.loc[df2['NAME'] == row['NAME'], str(row['YEAR'])].values[0],
    axis=1
)

内容的提问来源于stack exchange,提问作者no_more_lemons

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 20:13:13