假设您在 excel 中有一列,具有这样的值...仅存在5500个数字,但显示长度5602意味着存在102个字符串
4 SELECTIO
6 N NO
14 37001
26 37002
38 37003
47 37004
60 37005
73 37006
82 37007
92 37008
105 37009
119 37010
132 37011
143 37012
157 37013
168 37014
184 37015
196 37016
207 37017
220 37018
236 37019
253 37020
267 37021
280 37022
287 Krishan
290 37023
300 37024
316 37025
337 37026
365 37027
...
74141 42471
74154 42472
74169 42473
74184 42474
74200 42475
74216 42476
74233 42477
74242 42478
74256 42479
74271 42480
74290 42481
74309 42482
74323 42483
74336 42484
74350 42485
74365 42486
74378 42487
74389 42488
74398 42489
74413 42490
74430 42491
74446 42492
74459 42493
74474 42494
74491 42495
74504 42496
74516 42497
74530 42498
74544 42499
74558 42500
Name: Selection No., Length: 5602, dtype: object
并且我想使用pandas在python中仅获取这样的数值
37001
37002
37003
37004
37005
我该怎么做?我已经使用熊猫在python中附加了我的代码..................................................... .....
def selection(sle):
if sle in re.match('[3-4][0-9]{4}',sle):
return 1
else:
return 0
select['status'] = select['Selection No.'].apply(selection)
现在我遇到了"argument of type 'NoneType' is not iterable"
错误。
答案 0 :(得分:1)
您的函数包含错误的表达式:
if sle in re.match('[3-4][0-9]{4}',sle):
-它尝试在match object中查找列值sle
,“始终具有布尔值True
”({re.match
在没有匹配项时返回None
)
我建议继续使用pd.Series.str.isnumeric
函数:
In [544]: df
Out[544]:
Selection No.
0 37001
1 37002
2 37003
3 asnsh
4 37004
5 singh
6 37005
In [545]: df['Status'] = df['Selection No.'].str.isnumeric().astype(int)
In [546]: df
Out[546]:
Selection No. Status
0 37001 1
1 37002 1
2 37003 1
3 asnsh 0
4 37004 1
5 singh 0
6 37005 1
如果需要严格的正则表达式模式,请使用pd.Series.str.contains
函数:
df['Status'] = df['Selection No.'].str.contains('^[3-4][0-9]{4}$', regex=True).astype(int)
答案 1 :(得分:1)
尝试将Numpy与np.isreal一起使用,并且仅选择数字。
import pandas as pd
import numpy as np
df = pd.DataFrame({'SELECTIO':['N NO',37002,37003,'Krishan',37004,'singh',37005], 'some_col':[4,6,14,26,38,47,60]})
df
SELECTIO some_col
0 N NO 4
1 37002 6
2 37003 14
3 Krishan 26
4 37004 38
5 singh 47
6 37005 60
>>> df[df[['SELECTIO']].applymap(np.isreal).all(1)]
SELECTIO some_col
1 37002 6
2 37003 14
4 37004 38
6 37005 60
结果:
特定于列SELECTIO
..
df[df[['SELECTIO']].applymap(np.isreal).all(1)]
SELECTIO some_col
1 37002 6
2 37003 14
4 37004 38
6 37005 60
或者只是导入numbers
+ lambda
的另一种方法:
import numbers
df[df[['SELECTIO']].applymap(lambda x: isinstance(x, numbers.Number)).all(1)]
SELECTIO some_col
1 37002 6
2 37003 14
4 37004 38
6 37005 60
注意: 在提取正在使用的列时会出现问题 ['Selection No.']
,但实际上您在名称中会有一个空格就像 ['Selection No. ']
这就是您在执行它时得到 KeyError
的原因,请尝试看看!