如何从熊猫数据框中解析电话号码,最好使用电话号码库?
我正在尝试在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的初学者,所以也许这有一个简单的解决方案。但是,非常感谢您的帮助。
答案 0 :(得分:0)
实际上,您使用apply
的初始解决方案非常接近-您不会说什么对它不起作用,但是lambda函数的语法适用于数据框的多列,而不是针对其中的行单列,有点不同。试试这个:
df['phone_number_clean'] = df.apply(lambda x:
phonenumbers.parse(str(x.phone_number),
str(x.region_code)),
axis='columns')
差异:
您想在lambda函数中包括多个列,因此您想将lambda函数应用于整个数据帧(即df.apply
),而不是应用于Series(单个列),即通过执行df.phone_number.apply
返回。 (将df.phone_number
的输出打印到控制台-返回的是将给出lambda函数的所有信息)。
参数axis='columns'
(或等价的axis=1
,请参见docs)实际上是按行对数据进行切片,因此应用“看到”一个{{1 }}一次(即[index0,phonenumber0,countrycode0],[index1,phonenumber1,countrycode1] ...),而不是切片另一个方向,这会给它另一个方向([phonenumber0,phonenumber1,phonenumber2 ...] )
您的lambda函数仅知道占位符record
,在这种情况下,占位符为Series [index0,phonenumber0,countrycode0],因此您需要指定所有与{{ 1}},它知道-即x.phone_number,x.country_code。