如何遍历DataFrame多列并根据其他列值生成新列
根据DataFrame多列0/1值生成对应新列的正确实现
测试数据
import pandas as pd dftest = pd.DataFrame({'connection_0': ['0', '1','0','0','1'], 'connection_1': ['1', '0','1','1','0']},index=['819', '820','821','822','823'])
数据结构:
connection_0 connection_1 819 0 1 820 1 0 821 0 1 822 0 1 823 1 0
需求
在最左侧添加connect列:
- 当
connection_0为'1'时,connect值为"none" - 当
connection_1为'1'时,connect值为"patient"
(实际有更多类似列,后续可扩展)
预期结果:
connect connection_0 connection_1 819 patient 0 1 820 none 1 0 821 patient 0 1 822 patient 0 1 823 none 1 0
你的代码问题分析
你用iterrows()遍历的写法存在几个核心问题:
- 修改副本不影响原数据:
iterrows()返回的是原DataFrame行数据的副本,修改row.connect不会同步到dftest中,最终看到全为none是因为未初始化列导致的默认值问题。 - 逻辑语法错误:用位运算符
&代替了Python逻辑与and,且未先创建connect列就直接调用replace,完全不符合赋值逻辑。 - 效率低下:
iterrows()遍历在处理大量调研数据时速度极慢,Pandas官方更推荐用矢量化操作处理这类批量赋值场景。
正确实现方法
方法1:numpy.select(推荐,易扩展)
适合多条件场景,后续新增列时只需补充条件和对应值即可:
import numpy as np # 定义条件列表与对应结果值 conditions = [ dftest['connection_0'] == '1', dftest['connection_1'] == '1' ] choices = [ 'none', 'patient' ] # 生成connect列 dftest['connect'] = np.select(conditions, choices, default='') # default可按需设置 # 将connect列移至最左侧 dftest = dftest[['connect'] + [col for col in dftest.columns if col != 'connect']]
方法2:apply(可读性强,适合简单逻辑)
def get_connect_value(row): if row['connection_0'] == '1': return 'none' elif row['connection_1'] == '1': return 'patient' return '' # 默认值 dftest['connect'] = dftest.apply(get_connect_value, axis=1) # 调整列顺序 dftest = dftest[['connect'] + list(dftest.columns[:-1])]
方法3:链式条件赋值(适合少量条件)
# 初始化connect列 dftest['connect'] = '' # 按条件批量赋值 dftest.loc[dftest['connection_0'] == '1', 'connect'] = 'none' dftest.loc[dftest['connection_1'] == '1', 'connect'] = 'patient' # 调整列顺序 dftest = dftest.reindex(columns=['connect'] + dftest.columns[:-1].tolist())
以上任意方法都能生成预期结果,其中方法1和方法3的处理效率远高于iterrows(),更适合你的大量调研数据场景。
内容的提问来源于stack exchange,提问作者pyphan
相关产品推荐
相关产品推荐

