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
相关产品推荐
相关产品推荐

