0

(df)以下のようなデータフレームがあります

address1            address2            Subject
NaN                 jesicca@gmail.com   Invoice 3
NaN                 NaN                 Invoice 4
rahul@gmail.com     shuan@gmail.com     Invoice 5

私のロジックは以下の通りです

  1. 値が存在しaddress1address2が存在する場合、to_address値は Address1 である必要があります

  2. アドレス 1 とアドレス 2、または両方に値が存在しない場合はNaN、「david@gmailcom」を使用する必要があります。

  3. address1値が存在しない場合、または値NaNaddress2存在する場合は、これを取得する必要があります。

しかし、私の or-logic コードは必要に応じて機能しません。私が犯している間違いは何ですか。

私のコード:

for i, row in df.iterrows():
    subject  = row["Subject"]
    to_address = row['address1'] or row['address2'] or "david@gmailcom"
4

2 に答える 2

1

ラムダ関数でそれをやってみてください:

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
于 2020-07-22T10:32:23.783 に答える
0

最初に、ロジックを少し単純化する必要があります (説明は私にとって非常に紛らわしいです)。

第二に、タイプは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の場合、2 番目のアドレスがチェックされます。それNaNも同様である場合、デフォルトが選択されます。

于 2020-07-22T10:33:26.430 に答える