簡體   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