如何基于Pandas DataFrame的列名列提取对应值生成新列?
Pandas根据指定列名提取对应行值的高效实现
问题说明
现有Pandas DataFrame,其中col3列存储了DataFrame其他列的名称(如col1、col2)。需要新增col4列,根据col3每行的列名,提取对应列的同行值填充。业务场景存在重复值,当前通过循环实现但属于低效反模式,需更优方案。
示例数据
初始示例:
import pandas as pd d = {'col1': [1, 2], 'col2': [3, 4], 'col3':['col1', 'col2']} df = pd.DataFrame(data=d)
含重复值的场景:
import pandas as pd d = {'col1': [1, 2, 1], 'col2': [3, 4, 1], 'col3':['col1','col2', 'col1']} df = pd.DataFrame(data=d)
低效的循环实现(反模式)
df["col4"] = 0 # 初始化列 for i in range(0, df.shape[0]): df.loc[i, "col4"] = df.loc[i, df["col3"][i]]
高效解决方案
方案1:使用df.lookup(代码简洁,旧版本Pandas可用)
lookup是Pandas专门用于按行列索引提取值的向量化方法,效率远高于循环:
df['col4'] = df.lookup(df.index, df['col3'])
注意:Pandas 1.2.0及以上版本中
lookup已被标记为弃用,但仍可使用;若追求长期兼容性,推荐方案2。
方案2:使用numpy.take_along_axis(无版本限制,高性能)
通过将列名转换为列索引,结合numpy向量化操作提取值,无版本兼容问题:
import numpy as np # 获取col3中列名对应的列索引位置 col_indices = df.columns.get_indexer(df['col3']) # 提取对应位置的值并转为一维数组 df['col4'] = np.take_along_axis(df.values, col_indices[:, np.newaxis], axis=1).flatten()
方案3:使用apply(代码简洁,效率优于循环)
若追求代码简洁性,可使用apply逐行处理,效率比手动循环高:
df['col4'] = df.apply(lambda row: row[row['col3']], axis=1)
效果验证
上述方案最终生成的DataFrame均为:
| col1 | col2 | col3 | col4 |
|---|---|---|---|
| 1 | 3 | col1 | 1 |
| 2 | 4 | col2 | 4 |
| 1 | 1 | col1 | 1 |
内容的提问来源于stack exchange,提问作者Krisselack
相关产品推荐
相关产品推荐

