Python按多个条件筛选列
我有这样一个数据帧:Python按多个条件筛选列,python,pandas,Python,Pandas,我有这样一个数据帧: A B D d 151 M d 152 a d 153 M d 161 z d 164 M d 169 g d 178 g d 173 e d 176 j d 605 j d 603 d d 607 e d 905 j
A B D
d 151 M
d 152 a
d 153 M
d 161 z
d 164 M
d 169 g
d 178 g
d 173 e
d 176 j
d 605 j
d 603 d
d 607 e
d 905 j
d 903 d
d 907 e
我希望根据B列的值对其进行过滤。具体来说,我希望B列的值以15、16和60开头。我的数据帧将缩减为:
A B D
d 151 M
d 152 a
d 153 M
d 161 z
d 164 M
d 169 g
d 605 j
d 603 d
d 607 e
到目前为止,我还没有达到这个结果。实现这一点的最佳方法是什么?您需要首先转换为
str
,然后选择第一个2
值,这些值与以下值进行比较和过滤:
另一种解决方案是与自定义正则表达式一起使用-^
表示字符串的开头和|
或:
L = [15,16,90]
val = '|'.join(['^' + str(x) for x in L])
print (val)
^15|^16|^90
print (df[df.B.astype(str).str.contains(val)])
A B D
0 d 151 M
1 d 152 a
2 d 153 M
3 d 161 z
4 d 164 M
5 d 169 g
12 d 905 j
13 d 903 d
14 d 907 e
有点危险,如果在B列中是
None
或NaN
-获取错误。@jezrael更新为解决None或NaNonly我认为如果在B列中是None
或NaN
获取错误-所以解决方案只有在100%确定永远不会获取错误时才有效。所以最好是使用str.contains
或isin
来处理它。@jezrael是的,你能解释一下df.B.astype(str.str[:2]
我得到了它,直到df.B.astype(str)它把它类型转换成str.str[:2]我没有得到它。as str是在python中构建的。它被称为
L = [15,16,90]
val = '|'.join(['^' + str(x) for x in L])
print (val)
^15|^16|^90
print (df[df.B.astype(str).str.contains(val)])
A B D
0 d 151 M
1 d 152 a
2 d 153 M
3 d 161 z
4 d 164 M
5 d 169 g
12 d 905 j
13 d 903 d
14 d 907 e
>>> df[df['B'].map(lambda x: str(x[:2]) in ['15', '16', '60'])]
A B D
0 d 151 M
1 d 152 a
2 d 153 M
3 d 161 z
4 d 164 M
5 d 169 g
9 d 605 j
10 d 603 d
11 d 607 e