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

如何切片DataFrame至mask首次匹配行(包含该行)?

Pandas DataFrame 切片至mask首次匹配行(含该行)

问题场景

需要对Pandas DataFrame进行切片,保留到mask首次匹配的行(包含该行)。

示例数据

import pandas as pd
import numpy as np
df = pd.DataFrame(
    {
        'a': [np.nan, np.nan, np.nan, 20, 12, 42, 33, 32, 31],
        'b': [np.nan, np.nan, np.nan, np.nan, 2333, np.nan, np.nan, 12323, np.nan]
    }
)

Mask定义

mask = (
    (df.a.notna()) &
    (df.b.notna())
)

预期输出

a        b
0   NaN      NaN
1   NaN      NaN
2   NaN      NaN
3  20.0      NaN
4  12.0   2333.0

mask首次匹配的是索引为4的行,目标是切片至该行。

尝试方案分析

方案1(可行)

# attempt 1
idx = df.loc[mask.cumsum().eq(1) & mask].index[0]
df = df.loc[:idx]
print(df)

这个方法逻辑正确:mask.cumsum()统计累计匹配次数,当累计次数等于1且当前mask为True时,定位到首次匹配的行,取其索引后用loc[:idx]切片,能正确保留到首次匹配行(包含该行)。

方案2(不符合需求)

# attempt 2
out = df[~mask.cummax()]

mask.cummax()会在首次匹配后将所有后续行标记为True,取反后会排除首次匹配行及之后的所有行,最终结果仅保留索引0-3的行,不符合需求。

更简洁的写法

可以用mask.idxmax()直接获取首次匹配的索引,代码更简洁:

idx = mask.idxmax()
df = df.loc[:idx]

idxmax()会返回第一个True值对应的索引,刚好满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 22:48:28