Как использовать синтаксический анализ из фононных номеров библиотеки Python во фрейме данных pandas? - PullRequest
0 голосов
/ 27 июня 2019

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

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

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

Я пытался использовать apply, но это не сработало. Я получаю "(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"))

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

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

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

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

1 Ответ

0 голосов
/ 27 июня 2019

Ваше первоначальное решение с использованием 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, что эквивалентно, см. документы ) на самом деле разбивает фрейм данных по строкам, поэтому применять «видит»один record за один раз (т. е. [index0, phonenumber0, countrycode0], [index1, phonenumber1, countrycode1] ...), в отличие от нарезки другого направления, которое даст ему ([phonenumber0, phonenumber1, phonenumber2 ...])

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

...