如何在Pandas DataFrame中选取某列首次出现指定元素的行及之前所有行
提取DataFrame中指定元素首次出现行及之前所有行的常规方法
示例DataFrame
先构造示例数据:
import pandas as pd df = pd.DataFrame(index=['A', 'B', 'C', 'D'], data = [1,2,3,3])
生成的DataFrame如下:
0 A 1 B 2 C 3 D 3
需求
需要快速提取某列中首次出现指定元素(示例中为3)的行,以及该行之前的所有行。
已实现的解决方案
你已经找到一种可行写法:
import pandas as pd df = pd.DataFrame(index=['A', 'B', 'C', 'D'], data = [1,2,3,3]) mask = df[0].eq(3).cumsum().cumsum().le(1) r = df[mask] print(r)
运行结果符合预期:
0 A 1 B 2 C 3
更直观的常规实现方法
这里提供几种可读性更强、更符合Pandas常规用法的实现方式:
方法1:定位首次出现的索引后切片
直接找到目标元素首次出现的行索引,然后通过标签切片获取结果:
# 定位首次出现3的行索引 first_index = df[df[0] == 3].index[0] # 提取从开头到该索引的所有行 result = df.loc[:first_index]
也可以用eq()方法简化条件判断:
first_index = df[0].eq(3).idxmax() result = df.loc[:first_index]
方法2:用单次累加生成掩码(更易读)
相比两次cumsum的写法,单次累加后筛选更直观:
# 生成掩码:首次出现3及之前的行标记为True mask = df[0].eq(3).cumsum() <= 1 result = df[mask]
原理:目标元素出现前累加值为0,首次出现时累加值变为1,后续行累加值会持续增加,因此筛选累加值≤1的行即可得到目标范围。
方法3:通过位置索引切片
如果更习惯用位置而非行标签定位:
# 获取首次出现3的位置索引(从0开始) first_pos = df[0].eq(3).argmax() # 提取从开头到该位置(包含)的所有行 result = df.iloc[:first_pos + 1]
内容的提问来源于stack exchange,提问作者Laurent B.
相关产品推荐
相关产品推荐

