基于两列条件的Pandas DataFrame数据筛选问题
如何正确筛选移除Pandas DataFrame中同时满足Name='RACHEL'且Job='CHEF'的行
首先,我们先明确你的核心需求:只移除同时满足Name = 'RACHEL'且Job = 'CHEF'的行,其余所有行全部保留。你的原始DataFrame构造代码如下:
import pandas as pd data = pd.DataFrame({ 'Name': ['RACHEL', 'MONICA', 'PHOEBE', 'ROSS', 'CHANDLER', 'JOEY', 'RACHEL', 'RACHEL'], 'Age': [30, 35, 37, 33, 34, 30, 30, 15], 'Salary': [100000, 93000, 88000, 120000, 94000, 95000, 100000, 10], 'Job': ['DESIGNER', 'CHEF', 'MASUS', 'PALENTOLOGY', 'IT', 'ARTIST', 'DESIGNER', 'CHEF'] })
分析你之前的错误代码
你尝试的筛选代码:
data = data.loc[ (data.Name != 'RACHEL') & (data.Job != 'CHEF') ]
这个逻辑是保留所有Name不是RACHEL并且Job不是CHEF的行,这会错误地过滤掉所有Name为RACHEL的行(哪怕Job不是CHEF),以及所有Job为CHEF的行(哪怕Name不是RACHEL),完全不符合你的需求。
正确的筛选方法
我们需要排除的是同时满足两个条件的行,这里有两种简洁的实现方式:
方法1:直接取反“同时满足Name='RACHEL'且Job='CHEF'”的条件
通过~符号对目标条件取反,保留所有不满足该组合条件的行:
# 保留不满足(Name='RACHEL'且Job='CHEF')的所有行 filtered_data = data.loc[ ~((data.Name == 'RACHEL') & (data.Job == 'CHEF')) ]
方法2:利用德摩根定律转换条件
根据逻辑运算的德摩根定律,非(A且B) = 非A 或 非B,我们可以把条件转换成更易读的形式:
filtered_data = data.loc[ (data.Name != 'RACHEL') | (data.Job != 'CHEF') ]
两种方法都能得到你预期的结果:
Name Age Salary Job 0 RACHEL 30 100000 DESIGNER 1 MONICA 35 93000 CHEF 2 PHOEBE 37 88000 MASUS 3 ROSS 33 120000 PALENTOLOGY 4 CHANDLER 34 94000 IT 5 JOEY 30 95000 ARTIST 6 RACHEL 30 100000 DESIGNER
内容的提问来源于stack exchange,提问作者ChinwalPrasad
相关产品推荐
相关产品推荐

