You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤Pandas DataFrame且不返回切片对象?

过滤Pandas DataFrame避免返回切片对象的方法

问题背景

以下是一段过滤Pandas DataFrame的代码:

selected_options = ['option_1', 'option_2']

df = df[df['my_col'].isin(selected_options)]

这段代码返回的是切片对象,对其执行修改操作时会触发警告。已知可以通过调用.copy()解决:

df = df[df['my_col'].isin(selected_options)].copy()

现在想知道是否有更直接的方法,使用专门的过滤函数而非切片操作实现?

解决方案

当然有,Pandas提供了几种更直接的方式,无需依赖切片后再调用copy():

1. 使用DataFrame.query()

query()方法会直接返回独立的DataFrame对象,而非视图/切片,语法也更简洁:

selected_options = ['option_1', 'option_2']
df = df.query("my_col in @selected_options")

这里的@符号用于引用外部定义的selected_options变量,返回的DataFrame可以直接修改,不会触发视图警告。

2. 使用DataFrame.loc[]配合显式复制

loc本身可用于行筛选,结合copy=True参数(Pandas 1.3.0及以上版本支持),可以直接返回副本:

selected_options = ['option_1', 'option_2']
# 方式一:显式调用copy()
df = df.loc[df['my_col'].isin(selected_options), :].copy()
# 方式二:使用loc的copy参数(Pandas 1.3.0+)
df = df.loc[df['my_col'].isin(selected_options), :, copy=True]

这种方式比普通切片逻辑更清晰,通过显式控制返回副本,彻底规避视图相关的警告。

3. 使用DataFrame.where()(需额外处理空值)

where()方法会保留满足条件的行,不满足条件的行值会被设为NaN,配合dropna()可以得到过滤后的DataFrame:

selected_options = ['option_1', 'option_2']
df = df.where(df['my_col'].isin(selected_options)).dropna(axis=0, how='all')

不过这种方式需要额外处理空值,不如前两种方法直接。

总结

最推荐的是query()方法,它语法简洁且直接返回独立的DataFrame;如果需要更灵活的行/列组合筛选,loc配合显式复制也是可靠的选择。

内容的提问来源于stack exchange,提问作者user2138149

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 05:58:12