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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值