You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何遍历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()遍历的写法存在几个核心问题:

  1. 修改副本不影响原数据:iterrows()返回的是原DataFrame行数据的副本,修改row.connect不会同步到dftest中,最终看到全为none是因为未初始化列导致的默认值问题。
  2. 逻辑语法错误:用位运算符&代替了Python逻辑与and,且未先创建connect列就直接调用replace,完全不符合赋值逻辑。
  3. 效率低下: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:22:52