如何仅从此列中提取数字?

时间:2018-12-16 07:58:59

标签: python regex pandas

假设您在 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"错误。

2 个答案:

答案 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 的原因,请尝试看看!