pandas中对df进行多条件筛选
对于一个df,有的时候希望对df中每个列指定不同的筛选条件,并希望根据这个条件,直接筛选出最终的df结果。
例子:有一个df,字段有:性别,身高,体重
性别 | 身高 | 体重 |
男 | 高 | 140 |
男 | 矮 | 90 |
女 | 矮 | 85 |
女 | 高 | 85 |
现在我想根据以下条件:"性别==男",'身高==高or身高==矮','体重>100'。直接筛选出最终的df
代码如下:
def mutquery(self,df,listquary):
'''
多条件筛选
listquary:列表,分别指定每列的筛选条件
'''
#定义一个空列表,用来保存最终的索引条件
list_tiaos=[]
def fun_t(key):
'''
定义方法,将如'A列>15'这样的筛选条件按照>号分割成A列和15,,以便使用df['A']>15进行df的筛选
'''
if '>' in key:
#获取条件左右对应的字段和判断值
target=key.split('>')[0]
value=key.split('>')[1]
tiao=df[target]>eval(value)
elif '<' in key:
target=key.split('<')[0]
value=key.split('<')[1]
tiao=df[target]<eval(value)
elif '==' in key:
target=key.split('==')[0]
value=key.split('==')[1]
try:
#如果判断值是数字,则将其转化为数字再判断
tiao=df[target]==eval(value)
except:
#否则将其作为字符处理
tiao=df[target]==value
elif '>=' in key:
target=key.split('>=')[0]
value=key.split('>=')[1]
tiao=df[target]>=eval(value)
elif '<=' in key:
target=key.split('<=')[0]
value=key.split('<=')[1]
tiao=df[target]<=eval(value)
return tiao
#循环遍历每一个条件
for key in listquary:
#得到二维数组,[[bool1],[bool2]]
if 'or' in key:
query1=key.split('or')[0]
tiao1=fun_t(query1)
query2=key.split('or')[1]
tiao2=fun_t(query2)
tiao=np.array(tiao1)+np.array(tiao2)
list_tiaos.append(list(tiao))
elif 'and' in key:
query1=key.split('and')[0]
tiao1=fun_t(query1)
query2=key.split('and')[1]
tiao2=fun_t(query2)
tiao=np.array(tiao1)*np.array(tiao2)
list_tiaos.append(list(tiao))
else:
tiao=fun_t(key)
list_tiaos.append(tiao)
tiao_z=np.array(list_tiaos)
multiply=np.ones(tiao_z.shape[1])
for i in tiao_z:
#将所有的索引条件数组相乘,得到最终的索引数组
multiply=np.multiply(multiply,i)
#将索引数组,转化为True和False的逻辑数组,否则对df进行索引时会报错
multiply=[True if x >=1.0 else False for x in multiply]
df=df[list(multiply)]
return df