如何在Python中基于条件从DataFrame获取行号列表并展示被删除的异常值行号?
解决DataFrame获取符合条件行号的问题
我来帮你搞定这个问题,刚好你在做异常值删除需要展示被删除的行号,咱们一步步拆解:
先修正你当前的代码问题
你之前写的y= (df[x].loc[df[x] <= low_lim])返回单个numpy.int64值,是因为当只有一行满足条件时,df[x].loc[条件]会直接返回该位置的数值,而不是带索引的Series,所以你拿不到行号。要获取行号(也就是DataFrame的索引),得直接取筛选后行的索引,而不是列的值。
修正后的代码示例:
# 第一步:筛选出满足条件的行,获取它们的索引 filtered_indices = df.loc[df[x] <= low_lim].index # 第二步:把索引转成列表(方便后续格式化输出) indices_list = filtered_indices.tolist() # 第三步:按你需要的格式打印结果 if indices_list: print(f"{','.join(map(str, indices_list))}已被删除") else: print("没有符合条件的异常值行需要删除")
这样不管是一行还是多行满足条件,都能正确拿到行号列表,输出格式也符合你的要求。
通用方法:满足你的两个核心需求
一、基于等式从DataFrame中获取行号
如果你的条件是等式(比如某列等于某个目标值),可以用这两种方式:
- 布尔索引+index(最常用):
# 示例:获取column列等于target_value的行号列表 eq_indices = df[df['column'] == target_value].index.tolist() - numpy.where(适合需要数组形式的场景):
import numpy as np # where返回的是元组,取第一个元素就是索引数组 eq_indices = np.where(df['column'] == target_value)[0].tolist()
二、获取满足指定条件的行号列表
针对更复杂的条件(比如范围、多条件组合),这些方法更实用:
- 多条件布尔索引:
适合用&(且)、|(或)组合多个条件,注意每个条件要加括号:# 示例:column1小于等于下限 且 column2大于上限 condition = (df['column1'] <= low_lim) & (df['column2'] > high_lim) condition_indices = df[condition].index.tolist() - query方法:
写法更简洁,适合复杂的表达式,变量要加@前缀引用:# 示例:获取x列小于等于low_lim的行号 query_indices = df.query(f"{x} <= @low_lim").index.tolist() - 自定义apply判断:
如果你的条件是复杂的自定义逻辑(无法用简单表达式写),可以用apply,但大数据量下性能不如布尔索引:def check_row(row): # 这里写你的自定义判断逻辑 return row[x] <= low_lim apply_indices = df[df.apply(check_row, axis=1)].index.tolist()
内容的提问来源于stack exchange,提问作者Hüseyin Toprak
相关产品推荐
相关产品推荐

