Python Pandas按规则删除行:代码异常问题排查请求
问题排查与修复
核心逻辑错误:过滤条件写反了
你的需求是删除满足Bids < 3 且 Price > 149的行,但当前代码是把符合这个条件的行筛选出来保存——相当于只保留了要删除的行。如果原数据里符合该条件的行数量为0,就会直接生成空CSV;哪怕有符合条件的行,保存的也不是你想要的剩余数据。
正确的逻辑应该是保留不满足删除条件的行,只需对原条件取反:
filtered_df = df[~((df['Bids'] < 3) & (df['Price'] > 149))]
或者拆成更直观的写法:
filtered_df = df[(df['Bids'] >= 3) | (df['Price'] <= 149)]
额外排查点:数据转换的空值问题
你用pd.to_numeric(..., errors='coerce')会把无法转为数字的内容变成NaN,而NaN在布尔判断里会被视为False。如果CSV里Bids或Price列有大量非数字内容,转换后会出现大量空值,导致筛选条件无法匹配,最终结果为空。
可以先检查转换后的数据是否正常:
# 查看哪些行转换失败 print(df[df['Bids'].isna() | df['Price'].isna()])
如果有大量空值,要么先修正原始数据格式,要么把errors='coerce'改成errors='raise'——这样转换失败时会直接报错,方便定位问题。
修复后的完整代码
import pandas as pd def filter(csv_file, csv2_file): df = pd.read_csv(csv_file, header=0, index_col=False) # 转换为数值类型,转换失败时抛出错误便于排查 df['Bids'] = pd.to_numeric(df['Bids'], errors='raise') df['Price'] = pd.to_numeric(df['Price'], errors='raise') # 保留不需要删除的行 filtered_df = df[~((df['Bids'] < 3) & (df['Price'] > 149))] filtered_df.to_csv(csv2_file, index=False)
内容的提问来源于stack exchange,提问作者shofyankhan
相关产品推荐
相关产品推荐

