2017-09-29 4 views
0

私はあなたのライトが必要です! 私は、このコードによってデータフレームのビルドを持っている:私は何千もの結果を与えるが、これらのものの一つは、例えば可能性が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 

combinaison列のdtypesが対象です。それは配列ですか?

たとえば、項目1または5で見つかった組み合わせを除外するにはどうすれば結果をフィルタリングできますか? 私は整数列のデータフレームをフィルタリングする方法を知っていますが、型が配列またはオブジェクトのときの処理方法はわかりません。 ありがとうございます。

答えて

1

私が適用されます使用してフィルタリングを使用したい:

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

は編集:一般的に、カラム内にタプルの各値をつけた方が良いかもしれません。私はあなたが別の理由でタプルとしてそれを保持していると仮定します。

編集2:私のオリジナルのソリューションでは不要だった追加のラムダを使用していました。

1

あなたはすなわち

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

出力1つの要素の両方またはいずれかがCombinaison欄に予め設定されているかどうかを確認するためにnp.in1dに適用されます使用を使用することができます。

 
      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をフィルタリングするには1,5現在はanyの代わりにallを使用しています。

関連する問題