如何基于Pandas DataFrame的D列值从A1-A4列生成新列E?
解决Pandas根据指定列取值生成新列的问题
嘿,我来帮你搞定这个需求!你的目标是根据D列的数字(1-4),从对应的A1-A4列中提取值生成E列对吧?之前用apply没成功没关系,咱们用更高效、更简洁的方法来实现。
首先先把你的示例数据复现出来,方便测试:
import pandas as pd import numpy as np data = { 'A1': [0,7,3], 'A2': [2,6,7], 'A3': [9,7,4], 'A4': [0,3,9], 'B': [9,6,2], 'C': [7,8,1], 'D': [2,4,1] } df = pd.DataFrame(data)
方法一:使用lookup(适合旧版Pandas)
lookup可以直接根据行索引和列名来提取对应的值,刚好匹配你的需求:
# 把D列的数字转换成对应的列名(比如D=2 → 'A2') target_cols = 'A' + df['D'].astype(str) # 提取对应位置的值生成E列 df['E'] = df.lookup(df.index, target_cols)
运行后就能得到你想要的结果啦!不过要注意:Pandas 1.2.0之后lookup被标记为弃用,如果你用的是新版本,推荐下面的方法。
方法二:用numpy.take_along_axis(高效推荐)
这个方法更高效,适合大数据集,而且是官方推荐的lookup替代方案:
# 先提取所有以A开头的列(A1-A4) a_columns = df.filter(like='A') # 把D列的1-4转换成0-3的索引(因为Python是0起始索引) col_indices = df['D'].values - 1 # 生成行索引数组 row_indices = np.arange(len(df))[:, np.newaxis] # 提取对应位置的值并扁平化 df['E'] = np.take_along_axis(a_columns.values, col_indices[:, np.newaxis], axis=1).flatten()
方法三:用melt转格式后匹配(逻辑清晰)
如果你喜欢逻辑更直观的方式,可以把A列转成长格式后再匹配:
# 将A1-A4转成长格式,保留D列作为匹配键 melted_df = df.melt( id_vars=['D'], value_vars=['A1', 'A2', 'A3', 'A4'], var_name='A_column', value_name='E' ) # 提取A列名里的数字,和D列匹配 melted_df['A_num'] = melted_df['A_column'].str.extract('(\d+)').astype(int) # 筛选出D和A_num匹配的行,合并回原DataFrame df = df.merge( melted_df[melted_df['A_num'] == melted_df['D']][['E']], left_index=True, right_index=True )
至于你之前用apply没成功,大概率是因为逐行处理时没有正确构建目标列名,或者处理逻辑有误。上面的方法都比apply高效得多,尤其是数据量大的时候,尽量避免用apply逐行处理哦!
内容的提问来源于stack exchange,提问作者user2920100
相关产品推荐
相关产品推荐

