如何用Pandas删除x、y、z坐标在指定几何框内的行?
Pandas筛选DataFrame:排除同时满足多条件的行
可以用pandas的布尔索引结合条件取反快速实现,核心是先定位需要排除的行,再筛选出剩余行。
步骤示例
- 先构造与你示例一致的DataFrame:
import pandas as pd df = pd.DataFrame({ 'y': [0.8, 1, 1, -0.4, 0], 'x': [0.5, -0.3, -0.3, 1.5, 0.2], 'z': [2, 0, 0, 0, 1] })
- 定义排除条件(同时满足三个区间要求的行),再通过取反筛选目标行:
# 用between简化开区间判断,inclusive='neither'表示不包含区间端点 exclude_mask = (df['x'].between(-1, 1, inclusive='neither') & df['y'].between(-1, 1.5, inclusive='neither') & df['z'].between(-2.5, 2.5, inclusive='neither')) # ~符号对布尔掩码取反,保留不满足排除条件的行 result_df = df[~exclude_mask]
执行后得到的result_df就是你要的预期输出:
y x z 1 1.0 -0.3 0.0 2 1.0 -0.3 0.0 3 -0.4 1.5 0.0
兼容旧版pandas的写法
如果你的pandas版本低于1.3.0(不支持inclusive参数),可以手动写比较逻辑:
exclude_mask = ((df['x'] > -1) & (df['x'] < 1) & (df['y'] > -1) & (df['y'] < 1.5) & (df['z'] > -2.5) & (df['z'] < 2.5)) result_df = df[~exclude_mask]
另一种等价写法(逻辑转换)
根据逻辑运算规则,"排除同时满足A、B、C的行"等价于"保留至少不满足A/B/C中一个条件的行",也可以这样写:
keep_mask = (~df['x'].between(-1, 1, inclusive='neither')) | (~df['y'].between(-1, 1.5, inclusive='neither')) | (~df['z'].between(-2.5, 2.5, inclusive='neither')) result_df = df[keep_mask]
效果和之前完全一致,选哪种写法看个人习惯。
内容的提问来源于stack exchange,提问作者Aleksander
相关产品推荐
相关产品推荐

