Python Pandas按多个标准过滤列

时间:2017-05-06 07:54:55

标签: 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
 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

到目前为止,我还没有成功实现这一结果。哪个是实现这个目标的最佳方式?

2 个答案:

答案 0 :(得分:2)

您需要先转换为str,然后选择与isin进行比较并使用boolean indexing过滤的第一个2值:

print (df.B.astype(str).str[:2])
0     15
1     15
2     15
3     16
4     16
5     16
6     17
7     17
8     17
9     60
10    60
11    60
12    90
13    90
14    90
Name: B, dtype: object

print (df[df.B.astype(str).str[:2].isin(['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

另一个解决方案是使用contains和自定义正则表达式 - ^表示字符串的开头和|或:

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

答案 1 :(得分:0)

>>> 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