Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何基于序列相关约束筛选行?_Python_Pandas - Fatal编程技术网

Python 如何基于序列相关约束筛选行?

Python 如何基于序列相关约束筛选行?,python,pandas,Python,Pandas,我有以下数据帧: 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_0、VD_1、VD_2和VD_3的值列表:

我有以下数据帧:

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_0
VD_1
VD_2
VD_3
的值列表:

myList = [V1234,456,A45]
我只想获取
df
中的那些行,它们在
VD_0
VD_1
VD_2
VD_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_0
VD_1
的值相应地等于
V1234
456
,并且这两个值都属于
myList
。相同的逻辑应用于ID为
2(
456
A45
)和3(
456
V1234
)的行

我该怎么做?

试试这个:

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

我同意MaxU回答的开头,但结尾应该更容易。您想要的筛选器应该从列表中获得两个连续匹配项。你可以这样回答:如果你把isin结果的行和两行相加,你希望isin结果的行和至少是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

谢谢我在实际数据上得到了这个错误
IndexingError:Unalignable boolean Series key。这是什么意思?@Digoraius,如果您尝试执行“解释”部分中的所有命令-哪个命令会产生此错误?解释中的所有命令都可以正常工作。我收到假真值。当我将
子集[subset.isin(myList)].stack().duplicated().unstack().any(1)
放入
df
时,会发生错误。因此,这个命令对我不起作用:
df[subset[subset.isin(myList)].stack().duplicated().unstack().any(1)]
@dionolius,索引中有重复项吗?在
df的索引中有重复项吗?是的,可能是。您可能对我的另一个与此解决方案相关的问题感兴趣: