Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.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,我有这样一个数据帧: 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