2017-02-16 69 views
1

這個問題與my previous question有關。鑑於以下數據框:如何從數據框中提取特定序列?

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_5

myList = [V1234,456,A45] 

我想只有在df有2個或更多的「序貫」 occurances那些行的myListVD_0 - VD_5,的值,但允許它們之間有任何其他值(任何其他不屬於myList的值)。例如,這些允許值可能是aaabbbccc

結果應該是這樣:

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

result我想在Col_列顯示從myList只值,而忽略其餘的價值。

下面的代碼工作正常,但它允許在不出現任何myList值之間的它並沒有考慮到:

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

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

任何幫助將不勝感激。

回答

2

我認爲你需要檢查長度爲True的列和行的DataFramesumboolean DataFrame

然後是選擇列問題,因此需要從df.columns通過reindexfill_values=True添加缺少的列:

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',但不是'sum(axis = 1)> = 2' – Dinosaurius

+0

請檢查我編輯過的naswer。 – jezrael

+0

它看起來做我需要的,但在我的真實數據集中,我有超過100列'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