我需要你的灯! 我有一个由此代码构建的数据框:
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中找到的组合? 我知道如何在整数列上过滤数据帧但我不知道当类型是数组或对象时该怎么做。 非常感谢你。
答案 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
。