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

Python DataFrame遍历行处理列的if语句失效,process数组列存NaN

我懂你现在的困扰——想用hitdt里每行包含-1的列来生成process列,但手写的if逻辑不仅繁琐,还没生效,新列全是NaN对吧?咱们不用纠结复杂的循环判断,用pandas的原生方法就能干净利落地解决问题,而且效率更高。

先明确下核心需求:你是想标记每行是否存在-1?还是取第一个出现-1的列名?或是统计每行-1的数量?我给你覆盖几种常见场景的实现方式,你可以根据自己的需求调整:

先准备示例数据(方便你测试)

import pandas as pd
import numpy as np

# 模拟你的hitdt DataFrame
hitdt = pd.DataFrame({
    't1': [1, -1, 3, 4],
    't2': [-1, 2, -1, 5],
    't3': [3, 4, 5, -1],
    't4': [4, 5, 6, 7]
})

场景1:标记该行是否包含-1(布尔值)

如果只是想知道每行有没有-1,用一行代码就能搞定:

hitdt['process'] = hitdt.isin([-1]).any(axis=1)

isin([-1])会生成一个布尔矩阵,标记每个位置是否是-1;any(axis=1)则按行判断是否有至少一个True,最终得到每行的布尔结果。

场景2:获取每行第一个出现-1的列名

这应该是最贴合你“用包含-1的列决定process值”的需求了,这里有两种写法:

写法1:用apply(直观易懂)

def get_first_neg1_col(row):
    # 筛选出当前行值为-1的列索引
    neg1_cols = row[row == -1].index
    # 有-1就返回第一个列名,否则返回NaN
    return neg1_cols[0] if len(neg1_cols) > 0 else np.nan

hitdt['process'] = hitdt.apply(get_first_neg1_col, axis=1)

写法2:向量式操作(更高效,适合大数据集)

避免用apply循环,直接用pandas的向量方法:

# 生成标记-1位置的布尔矩阵
mask = hitdt == -1
# 取每行第一个True对应的列名,没有的话设为NaN
hitdt['process'] = mask.idxmax(axis=1).where(mask.any(axis=1), np.nan)

场景3:统计每行-1的数量

如果需要知道每行有多少个-1,可以这么写:

hitdt['process'] = hitdt.isin([-1]).sum(axis=1)

为什么你的if语句没生效?

大概率是循环赋值的时候出了问题——比如你可能用了for循环遍历每行,但没有正确把值赋值回hitdt['process'],或者判断条件覆盖不全(比如某行有多个-1时逻辑冲突)。用上面的pandas原生方法,既能避免循环的坑,代码也更简洁易维护。

内容的提问来源于stack exchange,提问作者y.x

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:35:59