我有以下数据框:
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
中myList
列VD_0
,VD_1
,VD_2
和{VD_3
中2个顺序出现值的行{1}}。
结果就是这个:
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
)的行。
我该怎么做?
答案 0 :(得分:2)
我同意MaxU答案的开头,但是,结束应该更容易IIUC。您想要的过滤器应该从列表中获得2个连续匹配。你可以通过说你希望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
答案 1 :(得分: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