在Python df中确定某些数字格式中的随机输入字符

时间:2018-09-13 17:21:34

标签: python pandas

我必须用Membership_id清除列,但是,有很多随机输入值,例如'0000000','99999','*','na'。

membership_id是序列号。成员ID的格式为4位数至12位数,其中:

4位数字-9位数字从任意非零数字开始,而10位至12位数字从1000xxxxxxxx开始。

对不起,由于一开始没有清楚地描述格式,我只是发现ID不符合此标准是无效的。我想将所有这些非会员ID格式都区分为​​0,谢谢您的帮助。

         member_id
 1      176828287         
 2      176841791         
 3      202142958         
 4      222539874         
 5      223565464         
 6      224721631         
 7      227675081         
 8      30235355118       
 9        %                  
10      ---                
11      .                  
12      .215694985         
13      0                  
14      00                 
15      000                
16      00000000000000     
17      99999999999999     
18      999999999999999    
19      : 211066980        
20      D5146159           
21      JulieGreen         
22      N/a                
23      NONE               
24      None               
25      PP - Premium Pr    
26      T0000              
27      T0000019           
28      T0000022           

3 个答案:

答案 0 :(得分:0)

您是否已经制作了满足要用0替换数据的条件的正则表达式?如果不是,则必须创建一个,或者为要替换的单个项创建字典terms = {'N/a':0, '---':0},然后在系列中调用.map(terms)

答案 1 :(得分:0)

如果我正确理解,请使用 regex表达式 = \A((1000\d{8})|([1-9]\d{3,10}))\Z会满足您的要求。

正则表达式上面的匹配项如下:

  1. 1000

  2. 开头的12位数字
  3. 4至11位数字,并且必须以1

  4. 开头

下面是一个演示

import pandas as pd
import re

df = pd.DataFrame(['176828287','176841791','202142958','222539874','223565464','224721631','227675081','30235355118',
  '%','---','.','.215694985','0','00','000','00000000000000','99999999999999','999999999999999',':211066980',
  'D5146159','JulieGreen','N/a','NONE','None','PP - PremiumPr','T0000','T0000019','T0000022'], columns=['member_id'])

r = re.compile(r'\A((1000\d{8})|([1-9]\d{3,10}))\Z')
df['valid'] = df['member_id'].apply(lambda x: bool(r.match(x)))
#you can use df['member_id'] = df['member_id'].apply(lambda x: x if bool(r.match(x)) else 0) to replace invalid id with 0
print(df)

输出

          member_id  valid
0         176828287   True
1         176841791   True
2         202142958   True
3         222539874   True
4         223565464   True
5         224721631   True
6         227675081   True
7       30235355118   True
8                 %  False
9               ---  False
10                .  False
11       .215694985  False
12                0  False
13               00  False
14              000  False
15   00000000000000  False
16   99999999999999  False
17  999999999999999  False
18       :211066980  False
19         D5146159  False
20       JulieGreen  False
21              N/a  False
22             NONE  False
23             None  False
24   PP - PremiumPr  False
25            T0000  False
26         T0000019  False
27         T0000022  False

答案 2 :(得分:0)

pandas具有内置的字符串函数,其中包括模式匹配算法。
因此,您可以轻松创建一个布尔型掩码,以区分有效ID和无效ID:

pattern = r'1000\d{6,8}$|[1-9]\d{3,8}$'
mask = df.member_id.str.match(pattern)

要仅打印有效行,只需将掩码用作索引:

print(df[mask])

    member_id
1  176828287                                                
2  176841791                                                
3  202142958                                                
4  222539874                                                
5  223565464                                                
6  224721631                                                
7  227675081                                                    

要将无效数据设置为0,只需使用掩码的补码即可:

df.loc[~mask] = 0
print(df)

    member_id                                               
1   176828287                                               
2   176841791                                              
3   202142958                                               
4   222539874                                               
5   223565464                                             
6   224721631                                               
7   227675081                                             
8           0                                             
9           0                                           
10          0                                            
11          0                                             
12          0
13          0
14          0
15          0
16          0
17          0
18          0
19          0
20          0
21          0
22          0
23          0
24          0
25          0
26          0
27          0
28          0