如何基于参考列在DataFrame中选择行值并生成新列?
没问题呀!刚接触pandas遇到这类逻辑列的问题太正常了,这其实是很常见的条件列赋值场景,给你几种实用的方法,从易理解到简洁都有,挑你顺手的用就行:
方法1:用loc逐条件赋值(最直观,适合新手理解)
这种方法逻辑最直白,就是逐个匹配Y列的取值,然后给Z列对应行赋值:
import pandas as pd # 假设你的DataFrame名为df # 先初始化Z列(如果不需要初始值也可以直接赋值) df['Z'] = '' # 当Y为'A'时,取D列的值 df.loc[df['Y'] == 'A', 'Z'] = df['D'] # 当Y为'B'时,取E列的值 df.loc[df['Y'] == 'B', 'Z'] = df['E'] # 当Y为'C'时,取F列的值 df.loc[df['Y'] == 'C', 'Z'] = df['F']
loc是pandas里按标签定位的工具,df.loc[条件, 目标列]就能精准选中符合条件的行,给目标列赋值,新手很容易看懂逻辑。
方法2:用numpy.select批量处理多条件
如果后续Y的取值可能增多,用numpy.select会更灵活,把条件和对应取值列做成列表一次性处理:
import pandas as pd import numpy as np # 定义条件列表 conditions = [ df['Y'] == 'A', df['Y'] == 'B', df['Y'] == 'C' ] # 对应条件要选取的列 choices = [df['D'], df['E'], df['F']] # 给Z列赋值,default是当所有条件都不匹配时的默认值,可以根据需求调整 df['Z'] = np.select(conditions, choices, default='')
这种方法把所有条件和取值放在一起,后期维护起来更方便,一眼就能看到所有规则。
方法3:用lookup一步到位(最简洁)
如果你追求代码简洁,这种方法用字典映射+lookup可以一行搞定:
import pandas as pd # 先创建一个映射字典:Y的取值对应要选的列名 col_mapping = {'A': 'D', 'B': 'E', 'C': 'F'} # 用map把Y列转换成对应的列名,再用lookup根据行索引和列名取值 df['Z'] = df.lookup(df.index, df['Y'].map(col_mapping))
lookup的作用就是根据行索引和列名的组合,提取对应位置的值,配合map把Y列转成列名,直接就能得到想要的Z列。
小补充
因为你的数据多是字符串类型,这些方法都能完美兼容,赋值后Z列的类型会和D/E/F列保持一致,如果需要统一转成字符串类型,可以加一行:
df['Z'] = df['Z'].astype(str)
内容的提问来源于stack exchange,提问作者Roy Han
相关产品推荐
相关产品推荐

