Pandas如何按条件提取DataFrame符合筛选规则的中间行
实现方案
直接通过布尔筛选+位置索引即可完成需求,用统一的索引计算逻辑兼容奇偶行数场景,无需额外写条件分支。
实现代码
import pandas as pd # 第一步:筛选C列值为1的行,保留原始先后顺序 c1_rows = df[df["C"] == 1] # 第二步:计算目标行位置,公式兼容奇偶两种场景 target_index = (len(c1_rows) - 1) // 2 # 第三步:按位置提取目标行,保留A/B/C三列,返回DataFrame格式 df_return = c1_rows.iloc[[target_index]][["A", "B", "C"]]
逻辑说明
- 索引计算公式
(行数-1) // 2是整数向下取整运算,完全匹配需求规则:- 当筛选出的行数为奇数,比如示例1的3行:(3-1)//2 = 1,对应0起始位置的第2行,就是正中间的
e p 1 - 当筛选出的行数为偶数,比如示例2的6行:(6-1)//2 = 2,对应0起始位置的第3行,就是两个中间行里靠前的
t b 1
- 当筛选出的行数为奇数,比如示例1的3行:(3-1)//2 = 1,对应0起始位置的第2行,就是正中间的
- 代码中
iloc是按数据的实际位置取数,不受原始DataFrame索引值影响,不会因为原索引不连续出现取数错误 iloc传入列表[target_index]是为了保证返回结果是DataFrame结构,如果直接传入整数值会返回Series格式,不符合df_return的格式要求
内容的提问来源于stack exchange,提问作者rbar1
相关产品推荐
相关产品推荐

