繁体   English   中英

使用python pandas如何进行一些分析以识别有效的手机号码

[英]Using python pandas how to do some analysis for identify valid mobile numbers

我每天都有MIS字段是“名称,号码和位置”。 现在,Total我每天有100行数据,我必须首先检查数字是否是10位数,如果数字字段是1到9位数,我必须删除我的MIS中的那个条目,

只有10位数字的有效数字和10位数字之前的额外+91有效。 所以,在excel我必须每天手动删除无效的数字及其全部。

接下来我必须将它发送到2个分支机构的有效号码。第一个分支机构的有效数字为50%,第二个分支机构的有效数量为50%,

在第一个分支中有两个人,所以我必须再向两个人发送同等有效的数字数据条目。 因此,例如:如果100个数据行中,总有效数为60,那么在第1个分支中总共发生30个有效数,每个人得到15-15个数。

在第二个分支中有三个人,有效的30个数字出现,每个三个得到10-10-10个数字。

任何帮助都会感激不尽。

这是我的代码。

import pandas as pd
import numpy as np
df = pd.read_csv('/home/desktop/Desktop/MIS.csv')
df
      Name        Number Location
0   Jayesh        980000     Pune
1     Ajay    9890989090   Mumbai
2   Manish    9999999999     Pune
3   Vikram  919000000000     Pune
4  Prakash  919999999999   Mumbai
5   Rakesh  919999999998   Mumbai
6   Naresh          9000     Pune


df['Number']=df['Number'].astype(str).apply(lambda x: np.where((len(x)<=10)))

采用 -

df['Number'].astype(str).str.match(r'(\+)*(91)*(\d{10})')

产量

0    False
1     True
2     True
3     True
4     True
5     True
6    False
Name: Number, dtype: bool

更新

使用此bool系列过滤 -

df_filtered = df[df['Number'].astype(str).str.match(r'(\+)*(91)*(\d{10})', as_indexer=True)]


Name    Number  Location
1   Ajay    9890989090  Mumbai
2   Manish  9999999999  Pune
3   Vikram  919000000000    Pune
4   Prakash 919999999999    Mumbai
5   Rakesh  919999999998    Mumbai

将您的数字转换为字符串然后执行比较很有吸引力。 但是,这不是必需的,并且通常效率低下。 您可以使用常规布尔比较和直接算法:

m1 = (np.log10(df['Number']).astype(int) + 1) == 12
m2 = (df['Number'] // 10**10) == 91

df_filtered = df[m1 & m2]

print(df_filtered)

      Name        Number Location
3   Vikram  919000000000     Pune
4  Prakash  919999999999   Mumbai
5   Rakesh  919999999998   Mumbai

用于将nan分配给不以91开头且小于10位的str:

df.Number[(~df.Number.str.startswith('91',na=False))&[len(df.Number[i])!= 10 for i in df.index]] = np.nan

如果数据可能与示例中给出的相符,则下面的内容应根据您的要求适用于您。

数据帧:

>>> df
      Name        Number Location
0   Jayesh        980000     Pune
1     Ajay    9890989090   Mumbai
2   Manish    9999999999     Pune
3   Vikram  919000000000     Pune
4  Prakash  919999999999   Mumbai
5   Rakesh  919999999998   Mumbai
6   Naresh          9000     Pune

结果:

使用str.match

>>> df[df.Number.astype(str).str.match(r'^(\d{10}|\d{12})$', as_indexer=True)]
      Name        Number Location
1     Ajay    9890989090   Mumbai
2   Manish    9999999999     Pune
3   Vikram  919000000000     Pune
4  Prakash  919999999999   Mumbai
5   Rakesh  919999999998   Mumbai

要么

>>> df[df.Number.astype(str).str.match(r'^[0-9]{10,12}$', as_indexer=True)]
      Name        Number Location
1     Ajay    9890989090   Mumbai
2   Manish    9999999999     Pune
3   Vikram  919000000000     Pune
4  Prakash  919999999999   Mumbai
5   Rakesh  919999999998   Mumbai

我建议使用以下正则表达式模式:

^\\+91\\d{10}$|^91\\d{10}$|^\\d{10}$

这是假设您的Number列中没有空格和/或括号。 该模式确保数字部分始终为10长(不多于不少),并使其前面加上+91或91。

要构建过滤后的数据框,您将:

dff = df[df['Number'].astype(str).str.match(r'^\\+91\\d{10}$|^91\\d{10}$|^\\d{10}$')]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM