2017-02-13 82 views
4

我有以下數據框:如何根據與序列相關的約束來過濾行?

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

還有就是VD_0VD_1VD_2VD_3值以下列表:我想只有在df有2的那些行

myList = [V1234,456,A45] 

myListVD_0,VD_1,VD_2VD_3的序列發生率。

結果是這樣的一種:

result = 
    ID TYPE VD_0 VD_1 VD_2 VD_3 
    1 ABC V1234 456 123 564 
    2 DBC 456 A45 123 564 
    3 ABD 456 V1234 456 123 

例如,在一行ID 1的VD_0VD_1和的值都等於V1234456,相應地,和這兩個值屬於myList。相同的邏輯適用於具有ID 2(456A45)和3(456,V1234)的行。

我該怎麼辦呢?

回答

2

我同意MaxU的答案的開始,但是,到底應該更容易IIUC。你想要的過濾器應該從你的列表中獲得2個連續的匹配。你可以得到這個答案,說你希望如果你把它們兩兩加起來,結果中的行數總和至少爲2。這被稱爲沿軸= 1的2週期滾動窗口總和。然後你採取每行的最大值,並且匹配具有大於或等於2的值:

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

df[subset.isin(myList).rolling(2, axis=1).sum().max(axis=1)>=2] 
Out[26]: 
    ID TYPE VD_0 VD_1 VD_2 VD_3 
0 1 ABC V1234 456 123 564 
1 2 DBC 456 A45 123 564 
2 3 ABD 456 V1234 456 123 
+0

它的工作原理。謝謝。 – Dinosaurius

+0

您可能對我與本解決方案相關的其他問題感興趣:http://stackoverflow.com/questions/42270774/how-to-extract-specific-sequences-from-a-dataframe – Dinosaurius

1

試試這個:

In [112]: subset = df.filter(like='VD_') 

In [113]: df[subset[subset.isin(myList)].stack().duplicated().unstack().any(1)] 
Out[113]: 
    ID TYPE VD_0 VD_1 VD_2 VD_3 
1 2 DBC 456 A45 123 564 
2 3 ABD 456 V1234 456 123 
3 4 ABD 123 V1234 SSW 123 

說明:

In [114]: subset 
Out[114]: 
    VD_0 VD_1 VD_2 VD_3 
0 V1234 456 123 564 
1 456 A45 123 564 
2 456 V1234 456 123 
3 123 V1234 SSW 123 

In [115]: subset.isin(myList) 
Out[115]: 
    VD_0 VD_1 VD_2 VD_3 
0 True True False False 
1 True True False False 
2 True True True False 
3 False True False False 

In [116]: subset[subset.isin(myList)] 
Out[116]: 
    VD_0 VD_1 VD_2 VD_3 
0 V1234 456 NaN NaN 
1 456 A45 NaN NaN 
2 456 V1234 456 NaN 
3 NaN V1234 NaN NaN 

In [118]: subset[subset.isin(myList)].stack() 
Out[118]: 
0 VD_0 V1234 
    VD_1  456 
1 VD_0  456 
    VD_1  A45 
2 VD_0  456 
    VD_1 V1234 
    VD_2  456 
3 VD_1 V1234 
dtype: object 

In [119]: subset[subset.isin(myList)].stack().duplicated() 
Out[119]: 
0 VD_0 False 
    VD_1 False 
1 VD_0  True 
    VD_1 False 
2 VD_0  True 
    VD_1  True 
    VD_2  True 
3 VD_1  True 
dtype: bool 

In [120]: subset[subset.isin(myList)].stack().duplicated().unstack() 
Out[120]: 
    VD_0 VD_1 VD_2 
0 False False None 
1 True False None 
2 True True True 
3 None True None 

In [121]: subset[subset.isin(myList)].stack().duplicated().unstack().any(1) 
Out[121]: 
0 False 
1  True 
2  True 
3  True 
dtype: bool 
+0

謝謝。我在我的真實數據上出現了這個錯誤「IndexingError:Unalignable boolean Series key provided」。這是什麼意思? – Dinosaurius

+0

@Dinosaurius,如果你試圖從「說明」部分執行所有的命令 - 哪個命令產生這個錯誤? – MaxU

+0

解釋中的所有命令都正常工作。我收到錯誤的真值。當我將'subset [subset.isin(myList)] stack()。duplicated()。unstack()。any(1)'放入'df'中時發生錯誤。所以,這個命令不適用於我:'df [subset [subset.isin(myList)]。stack()。duplicated()。unstack()。any(1)]' – Dinosaurius