如何在Pandas链式调用中删除含指定列值的行?
Pandas链式调用中删除指定列值对应行的正确方法
问题分析
你遇到的报错原因有两个:
- 链式调用中直接引用外部
df变量会触发TypeError:因为链式赋值还未完成,此时df是None,无法通过df[...]取值。 .drop(["cut_quality"].str.contains("None").index)触发AttributeError:["cut_quality"]是Python列表,没有Pandas的str属性,属于语法错误。
最优解决方案
在链式调用中,推荐直接用布尔索引筛选保留行(比drop更直观高效),通过lambda引用当前步骤的DataFrame即可:
df = (pd.read_csv("../data/stones_raw.csv", index_col=[0]) .drop(['date', 'id'], axis=1) .fillna({'color':'unknown', 'cut_quality':'unknown', 'girdle_max':'unknown', 'fluor_intensity':'unknown' }) .loc[:, ['color', 'cut_quality', 'girdle_max', 'fluor_intensity']] .loc[lambda x: ~x["cut_quality"].str.contains("None")] # 筛选出不含"None"的行 .to_pickle("../data/stones.pkl") )
补充:如果坚持用drop
也可以通过lambda获取需要删除的索引,写法如下:
df = (pd.read_csv("../data/stones_raw.csv", index_col=[0]) .drop(['date', 'id'], axis=1) .fillna({'color':'unknown', 'cut_quality':'unknown', 'girdle_max':'unknown', 'fluor_intensity':'unknown' }) .loc[:, ['color', 'cut_quality', 'girdle_max', 'fluor_intensity']] .drop(lambda x: x[x["cut_quality"].str.contains("None")].index) # 通过lambda获取当前DataFrame的索引 .to_pickle("../data/stones.pkl") )
说明
- 用
lambda x可以在链式调用中访问当前步骤的DataFrame,避免引用未赋值完成的外部变量。 - 直接筛选保留行的方式(
.loc[lambda x: ...])比drop更符合链式调用的流畅性,代码可读性更高,执行效率也更优。
内容的提问来源于stack exchange,提问作者hrokr
相关产品推荐
相关产品推荐

