Как использовать синтаксический анализ библиотеки Python для телефонных номеров в фрейме данных pandas?

Как я могу анализировать телефонные номера из фрейма данных pandas, в идеале используя библиотеку phonenumbers?

Я пытаюсь использовать порт библиотеки Google libphonenumber на Python, https://pypi.org/project/phonenumbers /.

У меня есть фрейм данных с 3 миллионами телефонных номеров из многих стран. У меня есть строка с номером телефона и строка с кодом страны/региона. Я пытаюсь использовать функцию разбора в package. Моя цель - проанализировать каждую строку, используя соответствующий код страны, но я не могу найти способ сделать это эффективно.

Я пытался использовать применить, но это не сработало. Я получаю сообщение «(0) Отсутствует или недействителен регион по умолчанию». ошибка, означающая, что он не передаст строку кода страны.

df['phone_number_clean'] = df.phone_number.apply(lambda x: 
phonenumbers.parse(str(df.phone_number),str(df.region_code)))

Строка ниже работает, но не дает мне того, что я хочу, так как цифры, которые я получил примерно из 120+ разных стран.

df['phone_number_clean'] = df.phone_number.apply(lambda x:
 phonenumbers.parse(str(df.phone_number),"US"))

Я пытался сделать это в цикле, но это ужасно медленно. Мне потребовалось больше часа, чтобы разобрать 10 000 чисел, и у меня примерно в 300 раз больше:

for i in range(n): 
    df3['phone_number_std'][i] = 
phonenumbers.parse(str(df.phone_number[i]),str(df.region_code[i]))

Есть ли метод, который мне не хватает, который мог бы работать быстрее? Функция применения работает приемлемо хорошо, но я не могу передать ей элемент фрейма данных.

Я все еще новичок в Python, поэтому, возможно, у этого есть простое решение. Но я был бы очень признателен за вашу помощь.


person Raul    schedule 27.06.2019    source источник


Ответы (1)


Ваше первоначальное решение с использованием apply на самом деле довольно близко - вы не говорите, что в нем не работает, но синтаксис лямбда-функции для нескольких столбцов фрейма данных, а не для строк в одном столбце, немного другой. Попробуй это:

df['phone_number_clean'] = df.apply(lambda x: 
                              phonenumbers.parse(str(x.phone_number), 
                                                 str(x.region_code)), 
                              axis='columns')

Различия:

  1. Вы хотите включить несколько столбцов в свою лямбда-функцию, поэтому вы хотите применить свою лямбда-функцию ко всему фрейму данных (т. е. df.apply), а не к ряду (один столбец), который возвращается при выполнении df.phone_number.apply. (выведите вывод df.phone_number на консоль - возвращается вся информация, которую будет предоставлена ​​вашей лямбда-функции).

  2. Аргумент axis='columns' (или axis=1, что эквивалентно, см. docs) на самом деле разделяет фрейм данных на строки, поэтому примените 'видит' по одной record за раз (т.е. [index0, phonenumber0, countrycode0], [index1, phonenumber1, countrycode1]...) как в отличие от разрезания в другом направлении, которое дало бы ему ([номер_телефона0, номер_телефона1, номер_телефона2...])

  3. Ваша лямбда-функция знает только о заполнителе x, которым в данном случае является серия [index0, phonenumber0, countrycode0], поэтому вам нужно указать все значения относительно x, которые она знает, т. е. x.phone_number, x .код страны.

person katelie    schedule 27.06.2019
comment
Благодарю вас! Это сработало как шарм. Этот подход занял 4 минуты, чтобы разобрать все 3 миллиона строк. - person Raul; 27.06.2019