我有一个这样的数据框:
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
到目前为止,我还没有成功实现这一结果。哪个是实现这个目标的最佳方式?
答案 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