如何基于Pandas两列的值更Pythonic地生成新列?
更Pythonic的Pandas列生成方案
针对你需要根据两列0/1值生成新列的需求,这里提供两种更符合Pythonic风格的实现方法,比字符串拼接替换更清晰高效:
方法1:numpy.select(推荐,高性能+可读性强)
numpy.select是处理多条件分支赋值的最优选择之一,性能远优于逐行处理的方法,适合大规模数据集,同时逻辑清晰易维护。
import pandas as pd import numpy as np # 构造示例DataFrame df = pd.DataFrame({'Aa': [1, 0, 1, 0], 'Bb': [1, 1, 0, 0]}) # 定义条件列表和对应的结果值 conditions = [ (df['Aa'] == 1) & (df['Bb'] == 1), (df['Aa'] == 0) & (df['Bb'] == 1), (df['Aa'] == 1) & (df['Bb'] == 0), ] choices = ['Both', 'B', 'A'] # 赋值,未匹配任何条件时用默认值'None' df['A_B'] = np.select(conditions, choices, default='None')
执行后得到的结果:
Aa Bb A_B 0 1 1 Both 1 0 1 B 2 1 0 A 3 0 0 None
方法2:字典映射元组(简洁直观)
将两列的取值组合成元组,通过预定义的字典直接映射结果,代码紧凑易懂,适合中小规模数据集。
import pandas as pd df = pd.DataFrame({'Aa': [1, 0, 1, 0], 'Bb': [1, 1, 0, 0]}) # 定义映射规则字典 result_map = { (1, 1): 'Both', (0, 1): 'B', (1, 0): 'A', (0, 0): 'None' } # 逐行将Aa和Bb转为元组后映射 df['A_B'] = df.apply(lambda x: result_map[(x['Aa'], x['Bb'])], axis=1)
两种方法对比
- 若处理百万级以上大数据集,优先选
numpy.select,它是向量化操作,性能比apply高一个数量级; - 若追求代码简洁性和可读性,字典映射的方法更直观,规则一目了然。
内容的提问来源于stack exchange,提问作者Ernesto Lopez Fune
相关产品推荐
相关产品推荐

