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

Python中DataFrame各列首个小于5的值的索引获取及apply问题排查

给DataFrame每列找第一个小于5的值的索引

你的apply代码为啥返回全0?

你写的这段代码:

Data.apply(lambda x: next((x for x, val in enumerate(Data) if val < 5),999))

问题出在遍历对象错了:

  • lambda里的x是当前处理的列(一个Series),但你用enumerate(Data)遍历的是整个DataFrame的列名(也就是0、1、2这三个整数)。
  • 这些列名全小于5,所以第一个满足条件的就是0,自然所有列都返回0。

正确的实现方式

要遍历当前列的元素,得对lambda的参数(当前列Series)做enumerate,代码改成这样:

import pandas as pd

Data = pd.DataFrame({0: [2,2,3,2,2,3,5],
    1: [8,7,7,8,7,7,7],
    2: [9,7,7,4,4,4,9]})

# 对每一列执行找第一个小于5的索引
result = Data.apply(lambda col: next((idx for idx, val in enumerate(col) if val < 5), 999))
print(result.tolist())  # 输出: [0, 999, 3]

这样就得到了你想要的结果。

处理NaN的情况

默认情况下,NaN和任何值比较都会返回False,所以原代码会自动跳过NaN继续找第一个小于5的值。如果需要更精细的处理,比如优先标记NaN的位置,或者区分“有NaN但无小于5的值”的情况,可以参考下面的写法:

1. 跳过NaN,只找有效且小于5的值

result = Data.apply(lambda col: next((idx for idx, val in enumerate(col) if pd.notna(val) and val < 5), 999))

2. 优先返回第一个NaN的索引(如果在小于5的值之前)

def find_first_idx(col):
    for idx, val in enumerate(col):
        if pd.isna(val):
            return idx
        if val < 5:
            return idx
    return 999

result = Data.apply(find_first_idx)

3. 区分“有NaN但无符合值”和“完全无符合值”

def find_first_with_nan_flag(col):
    has_nan = False
    for idx, val in enumerate(col):
        if pd.isna(val):
            has_nan = True
            continue
        if val < 5:
            return idx
    # 有NaN返回-1,无NaN返回999
    return -1 if has_nan else 999

result = Data.apply(find_first_with_nan_flag)

内容的提问来源于stack exchange,提问作者aarsmith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:06:29