Использование Python-панд, как провести анализ для определения действительных номеров мобильных телефонов. - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть ежедневные поля MIS: «Имя, номер и местоположение».Итого, у меня ежедневно 100 строк данных, и я должен сначала проверить, что числа в 10 цифр или нет, если числовые поля от 1 до 9 цифр, я должен удалить эту запись в моей MIS,

Действителен только действительный номер, такой как 10-значный и дополнительный +91 до 10-значного номераИтак, в Excel я должен ежедневно удалять эти недействительные номера и все их вручную.

далее я должен отправить его на действительный номер в 2 филиалах. 50% действительный номер в 1-й ветви и 50% действительный номер во 2-м филиалефилиал,

В 1-м филиале есть два человека, поэтому я снова должен отправить каждому человеку одинаково действительный номер для ввода данных.Так, например: если из 100 строк данных общее действительное число равно 60, то в 1-й ветви получается 30 действительных чисел, и каждые два человека получают 15-15 номеров.

Во 2-й ветви тричеловек, действительные 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)))

Ответы [ 5 ]

0 голосов
/ 29 декабря 2018

Я предлагаю использовать следующий шаблон регулярных выражений:

^\+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}$')]

0 голосов
/ 29 декабря 2018

Соблазнительно преобразовать ваши числа в строки, и затем выполнит ваши сравнения.Однако это не является необходимым и, как правило, будет неэффективным.Вы можете использовать регулярные логические сравнения с прямым алгоритмом:

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
0 голосов
/ 29 декабря 2018

Использование -

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
0 голосов
/ 29 декабря 2018

Если данные, скорее всего, соответствуют приведенным в примере, приведенные ниже должны работать для вас согласно вашему требованию.

DataFrame:

>>> 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
0 голосов
/ 29 декабря 2018

для назначения nan для str, который не начинается с 91 и имеет длину менее 10 цифр:

df.Number[(~df.Number.str.startswith('91',na=False))&[len(df.Number[i])!= 10 for i in df.index]] = np.nan
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...