[英]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.