2017-02-13 87 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

相关问题