我必须用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
答案 0 :(得分:0)
您是否已经制作了满足要用0替换数据的条件的正则表达式?如果不是,则必须创建一个,或者为要替换的单个项创建字典terms = {'N/a':0, '---':0}
,然后在系列中调用.map(terms)。
答案 1 :(得分:0)
如果我正确理解,请使用 regex表达式 = \A((1000\d{8})|([1-9]\d{3,10}))\Z
会满足您的要求。
正则表达式上面的匹配项如下:
以1000
4至11位数字,并且必须以1
下面是一个演示:
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