如何在 pandas 数据框上使用来自 phonenumbers Python 库的解析?

How to use parse from phonenumbers Python library on a pandas data frame?

如何从 pandas 数据框中解析 phone 数字,最好使用 phone 数字库?

我正在尝试在 Python 上使用 Google 的 libphonenumber 库的端口, https://pypi.org/project/phonenumbers/

我有一个数据框,其中包含来自许多国家/地区的 300 万 phone 个号码。我有一行带有 phone 数字,还有一行带有 country/region 代码。我正在尝试使用包中的解析函数。我的目标是使用相应的国家/地区代码解析每一行,但我找不到有效的方法。

我试过使用 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"))

我试过循环执行此操作,但速度非常慢。我花了一个多小时来解析 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]))

我是否缺少一种可以运行更快的方法? apply 函数运行良好,但我无法将数据框元素传递给它。

我仍然是 Python 的初学者,所以也许这有一个简单的解决方案。但非常感谢您的帮助。

您使用 apply 的初始解决方案实际上非常接近 - 您没有说什么不起作用,但是 lambda 函数的语法在数据框的多个列上,而不是在单列中的行,有点不同。试试这个:

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

差异:

  1. 您想在 lambda 函数中包含多个列,因此您想将 lambda 函数应用于整个数据框(即 df.apply)而不是系列(单个列)通过执行 df.phone_number.apply 返回。 (将 df.phone_number 的输出打印到控制台 - 返回的是您的 lambda 函数将提供的所有信息)。

  2. 参数axis='columns'(或等价的axis=1,参见docs)实际上是按行对数据帧进行切片,所以应用'sees' 一次 record (即 [index0, phonenumber0, countrycode0], [index1, phonenumber1, countrycode1]...),而不是从另一个方向切片,这会给它([phonenumber0, phonenumber1 , 电话号码2...])

  3. 您的 lambda 函数只知道占位符 x,在本例中,它是系列 [index0, phonenumber0, countrycode0],因此您需要指定所有相关值到它知道的 x - 即 x.phone_number、x.country_code。