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的索引中有重复项吗?是的,可能是。您可能对我的另一个与此解决方案相关的问题感兴趣: