我有一個資料框
>temp
Age Rank PhoneNumber State City
10 1 99-22344-1 Ga abc
15 12 No Ma xyz
對于列(電話號碼),我想洗掉所有字符,例如 - 除非它們是完整的電話號碼,并且如果它說“否”或除數字之外的任何單詞,我希望它是空白的。我怎樣才能做到這一點
我的嘗試能夠處理特殊字符,但不能處理諸如“否”之類的單詞符號
temp['PhoneNumber '] = temp['PhoneNumber '].str.replace('[^\d] ', '')
期望的輸出 df -
>temp
Age Rank PhoneNumber State City
10 1 99223441 Ga abc
15 12 Ma xyz
uj5u.com熱心網友回復:
這可以完成作業。
import pandas as pd
import re
data = [
[10, 1, '99-223344-1', 'GA', 'Abc'],
[15, 12, "No", 'MA', 'Xyz']
]
df = pd.DataFrame(data, columns=['Age Rank PhoneNumber State City'.split()])
print(df)
def valphone(p):
p = p['PhoneNumber']
if re.match(r'[123456789-] $', p):
return p
else:
return ""
print(df['PhoneNumber'])
df['PhoneNumber'] = df['PhoneNumber'].apply(valphone, axis=1)
print(df)
輸出:
Age Rank PhoneNumber State City
0 10 1 99-223344-1 GA Abc
1 15 12 No MA Xyz
Age Rank PhoneNumber State City
0 10 1 99-223344-1 GA Abc
1 15 12 MA Xyz
我不得不承認對此有點沮喪。我希望能夠做到
df['PhoneNumber'] = df['PhoneNumber'].apply(valphone)
因為df['PhoneNumber']應該回傳一個系列,并且Series.apply函式應該一次傳遞一個值。但是,這不是這里發生的事情,我不知道為什么。 df['PhoneNumber']回傳一個 DataFrame 而不是一個系列,所以我必須在函式內使用列參考。
因此,您可能需要做一些實驗。如果df['PhoneNumber']為您回傳一個系列,那么您不需要axis=1,并且您不需要p = p['PhoneNumber']函式中的行。
跟進
好的,假設存在“電話號碼驗證”模塊,如評論中所述,這將變為:
import phonenumbers
...
def valphone(p):
p = p['PhoneNumber'] # May not be required
n = phonenumbmers.parse(p)
if phonenumbers.is_possible_number(n):
return p
else:
return ''
...
uj5u.com熱心網友回復:
temp['PhoneNumber'] = temp['PhoneNumber'].apply(str).str.findall(r'\d').str.join('')
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/470747.html
