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

如何在Pandas中利用列值匹配对应列标题并生成新列

解决Pandas中通过year列匹配列标题生成新列的问题

需求说明

现有一个以itemName为索引的Pandas DataFrame,需根据year列的数值,匹配对应的年份列标题,生成新列year_name。示例数据及期望结果如下:

原始DataFrame

itemName20202021202220232024year
item15201010503
item210105020402
item312357310544

期望结果

itemName20202021202220232024yearyear_name
item152010105032022
item2101050204022021
item3123573105442023

错误分析

你尝试的两段代码存在以下问题:

  • 第一段代码报错TypeError: list indices must be integers or slices, not Series:对单列使用apply时,lambda参数x是整个列的Series对象,而列表只能用整数/切片索引,无法直接用Series索引,因此报错。
  • 第二段代码报错IndexError: list index out of range:一是你依然按列处理apply,x.iloc[0]只会取第一行的year值,无法覆盖所有行;二是year列的数值是1-based索引(比如year=3对应第3个年份列),但列表是0-based索引,直接用原数值索引会超出列表范围。

修正方案

方法1:用apply逐行处理(修正lambda)

先提取年份列的名称列表,再对year列逐行应用lambda,将1-based的year值转换为0-based的列表索引:

# 提取年份列的名称列表(排除year列)
col_names = [col for col in result_df.columns if col != 'year']
# 生成year_name列
result_df['year_name'] = result_df['year'].apply(lambda x: col_names[x - 1])

方法2:更简洁的map方式

如果year值和列表索引的对应关系固定(year值-1=列表索引),也可以用map实现:

col_names = [col for col in result_df.columns if col != 'year']
result_df['year_name'] = result_df['year'].map(lambda x: col_names[x-1])

执行上述代码后,即可得到你期望的DataFrame,year列的数值会正确匹配对应的年份列标题,生成year_name列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 10:33:10