我有一個包含電話號碼行的資料框。我撰寫了以下函式來用空字串填充任何 NaN,然后??在需要它們的任何電話號碼上添加“ ”和“1”。
def fixCampaignerPhone(phone):
if phone.isnull():
phone = ''
phone = str(phone)
if len(phone) == 10:
phone = ('1' phone)
if len(phone) > 1:
phone = (' ' phone)
return phone
我嘗試將此函式應用于資料框的列,如下所示:
df['phone'] = df.apply(lambda row: fixCampaignerPhone(row['phone']), axis =1)
我的函式沒有正確識別和替換 NaN 值。錯誤“'float' 型別的物件沒有 len()”我在單獨的行上使用 .fillna() 解決了它,但我想了解為什么這不起作用。如果我手動傳遞 NaN 值,該函式會起作用,所以我認為它與熊貓將引數作為浮點物件傳遞的事實有關,而不僅僅是常規浮點數。
編輯:帶有用于除錯的示例資料的完整作業代碼。
import pandas as pd
import numpy as np
def fixCampaignerPhone(phone):# adds and 1 to front of phone numbers if necessary
if phone.isnull():
phone = ''
phone = str(phone)
if len(phone) == 10:
phone = ('1' phone)
if len(phone) > 1:
phone = (' ' phone)
return phone
d = {0: float("NaN"), 1:"2025676789"}
sampledata = pd.Series(data = d, index = [0 , 1])
sampledata.apply(lambda row: fixCampaignerPhone(row))
編輯 2:將 phone.isnull() 更改為 pd.isna(phone) 適用于我的示例資料,但不適用于我的生產資料集,所以它一定只是我資料中某個地方的一個奇怪的怪癖。對于背景關系,我的生產資料集中的電話號碼必須是 NaN、以 1 開頭的 11 位字串或 10 位字串。然而,當我在我的生產資料集上運行我的 lambda 函式時,我收到錯誤“'float' 型別的物件沒有 len()”所以不知何故一些浮點數/NaN 滑過了我的 if 陳述句
uj5u.com熱心網友回復:
從這個虛構的 DataFrame :
>>> import pandas as pd
>>> from io import StringIO
>>> df = pd.read_csv(StringIO("""
A,phone
L,3453454564
L,345345
R,345345
h,3
A,345345
L,345345
R,3453434543
R,345345
R,345345
R,345345
"""), sep=',')
>>> df
A phone
0 L 3453454564
1 L 345345
2 R 345345
3 h 3
4 A 345345
5 L 345345
6 R 3453434543
7 R 345345
8 R 345345
9 R 345345
我們可以使用selectfromnumpy來構建我們的if細分市場并獲得預期的結果:
import numpy as np
df['phone'] = df['phone'].astype(str)
condlist = [df['phone'].str.len() == 10,
df['phone'].str.len() > 1]
choicelist = ['1' df['phone'],
' ' df['phone']]
df['phone'] = np.select(condlist, choicelist, default='')
輸出 :
A phone
0 L 13453454564
1 L 345345
2 R 345345
3 h
4 A 345345
5 L 345345
6 R 13453434543
7 R 345345
8 R 345345
9 R 345345
uj5u.com熱心網友回復:
這是一段作業代碼,您必須使用 pd.isnull(phone) 而不是 phone.isnull():
import pandas as pd
import numpy as np
def fixCampaignerPhone(phone):# adds and 1 to front of phone numbers if necessary
if pd.isnull(phone):
phone = ''
phone = str(phone)
if len(phone) == 10:
phone = ('1' phone)
if len(phone) > 1:
phone = (' ' phone)
return phone
d = {0: float("NaN"), 1:"2025676789"}
sampledata = pd.Series(data = d, index = [0 , 1])
r=sampledata.apply(lambda row: fixCampaignerPhone(row))
print(r)
結果是:
0
1 12025676789
dtype: object
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/384371.html
上一篇:肥學說電影(1)——雙城之戰
