pandas dataframe过滤一个Object列?

时间:2017-09-29 16:33:07

标签: python pandas dataframe

我需要你的灯! 我有一个由此代码构建的数据框:

import itertools as ite
import pandas as pd

items=[1,2,3,4,5,6,7,8,9,10,11,12]
data = [200,250,190,0,132,149,168,0,198,184,176,203]

result=[(combi,len(da),sum(da),min(da),max(da)) 
        for nbCombi in range(5,10) 
               for combi,da in zip(ite.combinations(items, nbCombi),ite.combinations(data, nbCombi))]

df=pd.DataFrame(result,columns=["Combinaison","Nb","Poids","Min","Max"])
df['Ecart']=df['Min']-df['Max']

这给了我数千个结果,但其中一个可能是例如:

Combinaison               Nb     Poids     Min     Max    Ecart   
(1, 2, 5, 6, 10, 11)      6      942        0      250     250

组合柱的dtypes是对象。它是一个数组吗?

如何过滤结果以排除项目1或5中找到的组合? 我知道如何在整数列上过滤数据帧但我不知道当类型是数组或对象时该怎么做。 非常感谢你。

2 个答案:

答案 0 :(得分:1)

我使用apply:

进行过滤
df[df.Combinaison.apply(lambda val: not any([i in val for i in [1,5]]))]

编辑:通常,将元组的每个值放入一列可能更好。我假设你将其作为一个元组用于其他原因。

编辑2:我原来的解决方案使用了额外的lambda,这是不必要的。

答案 1 :(得分:1)

您可以使用apply with np.in1d来检查Combinaison列中是否预设了一个元素或两个元素,即

import numpy as np
df[~df.Combinaison.apply(lambda x : any(np.in1d([1,5],np.array(x))))]

输出:

          Combinaison  Nb  Poids  Min  Max  Ecart
337   (2, 3, 4, 6, 7)   5    757    0  250   -250
338   (2, 3, 4, 6, 8)   5    589    0  250   -250
339   (2, 3, 4, 6, 9)   5    787    0  250   -250
340  (2, 3, 4, 6, 10)   5    773    0  250   -250
341  (2, 3, 4, 6, 11)   5    765    0  250   -250

使用当前使用的Combinaison代替all来过滤any