簡體   English   中英

或者當存在使用 Python 的 NaN 值時邏輯不起作用

[英]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

我的邏輯如下

  1. 如果地址address2 to_address address1應為地址 1

  2. 如果地址 1 和地址 2 中不存在任何值,或者兩者均為NaN ,則應采用“david@gmailcom”

  3. 如果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.

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