如何过滤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
相关产品推荐
相关产品推荐

