![](/img/trans.png)
[英]Using python pandas how to do some following analysis for calculation
[英]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.