![](/img/trans.png)
[英]Filling NaN values with values that are not NaN using Python Pandas
[英]Or logic not working when there are NaN values using Python
我有 dataframe (df)
如下
address1 address2 Subject
NaN jesicca@gmail.com Invoice 3
NaN NaN Invoice 4
rahul@gmail.com shuan@gmail.com Invoice 5
我的邏輯如下
如果地址address2
to_address
address1
應為地址 1
如果地址 1 和地址 2 中不存在任何值,或者兩者均為NaN
,則應采用“david@gmailcom”
如果address1
值不存在或NaN
並且address2
值存在,則應采用該值。
但是我的或邏輯代碼不能按要求工作。 我犯了什么錯誤。
我的代碼:
for i, row in df.iterrows():
subject = row["Subject"]
to_address = row['address1'] or row['address2'] or "david@gmailcom"
嘗試使用 lambda function 來做到這一點:
df = pd.DataFrame([[float("nan"),"jesicca@gmail.com","Invoice 3"],[float("nan"),float("nan"),"Invoice 4"],
["rahul@gmail.com","shuan@gmail.com","Invoice 5"]], columns = ["address1","address2","Subject"])
df["case"] = df.apply(lambda x: x["address1"] if not pd.isna(x["address1"]) \
else x['address2'] if not pd.isna(x["address2"]) \
else "david@gmailcom", axis = 1)
df
address1 address2 Subject case
0 NaN jesicca@gmail.com Invoice 3 jesicca@gmail.com
1 NaN NaN Invoice 4 david@gmailcom
2 rahul@gmail.com shuan@gmail.com Invoice 5 rahul@gmail.com
首先,你應該稍微簡化你的邏輯(這個解釋讓我很困惑)。
其次, NaN
是什么類型? 我假設它是float('nan')
,但如果它只是字符串NaN
那么你需要將float('nan')
更改為NaN
據我了解,是這樣的:
for i, row in df.iterrows():
subject = row["Subject"]
if row['address1'] == float('nan'):
to_address = row['address1']
elif row['address2'] == float('nan'):
to_address = row['address2']
else:
to_address = "david@gmailcom"
因此,如果第一個地址是NaN
,則檢查第二個地址。 如果那個也是NaN
,則選擇默認值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.