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

时间:2019-06-27 00:40:05

标签: python pandas dataframe apply libphonenumber

如何从熊猫数据框中解析电话号码,最好使用电话号码库?

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

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

我尝试使用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的初学者,所以也许这有一个简单的解决方案。但是,非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

实际上,您使用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),而不是应用于Series(单个列),即通过执行df.phone_number.apply返回。 (将df.phone_number的输出打印到控制台-返回的是将给出lambda函数的所有信息)。

  2. 参数axis='columns'(或等价的axis=1,请参见docs)实际上是按行对数据进行切片,因此应用“看到”一个{{1 }}一次(即[index0,phonenumber0,countrycode0],[index1,phonenumber1,countrycode1] ...),而不是切片另一个方向,这会给它另一个方向([phonenumber0,phonenumber1,phonenumber2 ...] )

  3. 您的lambda函数仅知道占位符record,在这种情况下,占位符为Series [index0,phonenumber0,countrycode0],因此您需要指定所有与{{ 1}},它知道-即x.phone_number,x.country_code。