簡體   English   中英

如何在 pandas 數據框上使用來自 phonenumbers Python 庫的解析?

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

如何從 pandas 數據框中解析電話號碼,最好使用電話號碼庫?

我正在嘗試在 Python, https://pypi.org/project/phonenumbers/上使用 Google 的 libphonenumber 庫的一個端口。

我有一個包含來自許多國家的 300 萬個電話號碼的數據框。 我有一行是電話號碼,一行是國家/地區代碼。 我正在嘗試在 package 中使用解析 function。我的目標是使用相應的國家代碼解析每一行,但我找不到有效的方法。

我嘗試使用 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 function 工作得很好,但我無法將數據框元素傳遞給它。

我還是 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.apply ),而不是應用於通過執行df.phone_number.apply返回的Series(單個列) 。 (將df.phone_number的輸出打印到控制台-返回的是將給出lambda函數的所有信息)。

  2. 參數axis='columns' (或axis=1 ,等價,請參閱docs )實際上是按行對數據進行切片,因此一次應用一次“ sees”一條record (即[index0,phonenumber0,countrycode0], [index1,phonenumber1,countrycode1] ...),而不是切成另一個方向([phonenumber0,phonenumber1,phonenumber2 ...])

  3. 您的lambda函數僅知道占位符x ,在這種情況下,該占位符是Series [index0,phonenumber0,countrycode0],因此您需要指定與其已知的x相關的所有值-即x.phone_number,x 。國家代碼。

喜歡@katelie 的解決方案。 但這是我的代碼。 添加了 try/except function 以跳過電話號碼 function 失敗。 它無法處理長度過長的字符串。

    import phonenumber as phon

def formatE164(self): 
  try:
    return phon.format_number(phon.parse(str(self),"NL"),phon.PhoneNumberFormat.E164)
  except:
    pass
    
df['column'] = df['column'].apply(formatE164)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM