2017-02-16 7 views
1

この質問はmy previous questionに関連しています。データフレームから特定のシーケンスを抽出する方法は?

myList = [V1234,456,A45] 

私は2以上の「連番の」回出ていdfで行のみを取得したい: - VD_5

df = 
    ID TYPE VD_0 VD_1 VD_2 VD_3 VD_4 VD_5 
    1 ABC V1234 aaa bbb 456 123 564 
    2 DBC 456 A45 aaa V1234 bbb 564 
    3 ABD 456 V1234 bbb ccc 456 123 
    4 ABD ccc aaa 123 V1234 SSW 123 

VD_0の目標値の次のリストがあります:以下のデータフレームを考えますVD_0-VD_5,の値のうちmyListの値のうち、myListに属しない値)の間の他の値を使用することができます。例えば、これらの許容値は、結果はこの1つであるべきなど

aaabbbccc、次のようになります。私は列Col_myListから値のみを表示したいresult

result = 
    ID TYPE Col_0 Col_1 Col_2 
    1 ABC V1234 456 
    2 DBC 456  A45  V1234 
    3 ABD 456  V1234 456 

、残りの値は無視します。

次のコードは正常に動作しますが、それはmyListに表示されない任意の値の間に持つことが許されていることを考慮していない:

subset = df.filter(like='VD_') 

df[subset.isin(myList).rolling(2, axis=1).sum().max(axis=1)>=2] 

任意の助けが理解されるであろう。

答えて

2

DataFramesumboolean DataFrameのチェックの長さがTrueの列と行である必要があると思います。

その後の列を選択するための問題ですので、fill_values=Truereindexによってdf.columnsから欠落している列を追加必要があります。

myList = ['V1234','456','A45'] 
subset = df.filter(like='VD_') 

subset1 = subset.isin(myList) 
mask1 = subset1.sum(axis=1) >= 2 
print (mask1) 

0  True 
1  True 
2  True 
3 False 
dtype: bool 

mask2 = subset1.sum() >= 2 
print (mask2) 
VD_0  True 
VD_1  True 
VD_2 False 
VD_3  True 
VD_4 False 
VD_5 False 
dtype: bool 

print (mask2.reindex(df.columns, fill_value=True)) 
ID  True 
TYPE  True 
VD_0  True 
VD_1  True 
VD_2 False 
VD_3  True 
VD_4 False 
VD_5 False 
dtype: bool 
print (df.loc[mask1, mask2.reindex(df.columns, fill_value=True)]) 
    ID TYPE VD_0 VD_1 VD_3 
0 1 ABC V1234 aaa 456 
1 2 DBC 456 A45 V1234 
2 3 ABD 456 V1234 ccc 
+0

私の例に似て、最終結果に 'myList'からの値だけを表示することは可能ですか?また、 'sum(axis = 1)> 1'を使用する理由について説明してください。 – Dinosaurius

+0

編集したnaswerを確認してください。 – jezrael

+0

私は必要なことをするように見えますが、私の実際のデータセットには10​​0列以上の 'VD_'があります。最終結果が 'aaa'、' ccc'、および 'myList'以外の値を表示しない可能性はありますか? – Dinosaurius

1

ここでは別の方法です。

In [903]: df.apply(lambda x: [y for y in x if y in myList], axis=1) 
Out[903]: 
0   [V1234, 456] 
1 [456, A45, V1234] 
2 [456, V1234, 456] 
3    [V1234] 
dtype: object 

In [904]: s = df.apply(lambda x: [y for y in x if y in myList], axis=1) 

In [905]: s[s.apply(len) >= 2] 
Out[905]: 
0   [V1234, 456] 
1 [456, A45, V1234] 
2 [456, V1234, 456] 
dtype: object 

In [906]: s[s.apply(len) >= 2].apply(pd.Series) 
Out[906]: 
     0  1  2 
0 V1234 456 NaN 
1 456 A45 V1234 
2 456 V1234 456 
関連する問題