Pandas лямбда-функция не распознает NaN - PullRequest
1 голос
/ 14 февраля 2020

Я пытаюсь оценить новый столбец в DF по значениям двух других, но если значение отсутствует, я пытаюсь передать другое выражение.

df_merge["3"] = df_merge.apply(lambda row: row["1"] + row["2"] 
    if pd.isnull(row["1"]) or pd.isnull(row["2"])
    else (row["1"] + row["2"])/2, 
    axis=1)

                         loc              1               2               3
    0                   135200           0.391           0.224          0.3075
    1                   135210           0.400           0.220          0.3100
    95                  136150             NaN           0.505             NaN
    96                  136160             NaN           0.527             NaN

Это то, что я получил. Поэтому, если 1 или 2 - ноль, я хочу использовать первое выражение, иначе последнее. Однако первое выражение никогда не передается. Если я попытаюсь проверить, например:

pd.isnull(df_merge.iloc[96,3])

Он оценивается как True, так почему же первое выражение, переданное в этом экземпляре, не передается ??

Я также попытался:

df_merge["3"].fillna(value=df_merge["1"] + df_merge["2"],inplace=True)

Который точно ничего не сделал.

С уважением, Фредрик

1 Ответ

1 голос
/ 14 февраля 2020

Самым простым здесь является использование mean для строк, поскольку по умолчанию в pandas опускается NaN с (если не оба NaN, такие как строка 2):

df_merge = pd.DataFrame({'1':[np.nan, np.nan, 1, 2],
                   '2':[5, np.nan, np.nan, 4]})

df_merge["3"] = df_merge[["1",'2']].mean(axis=1)
print (df_merge)
     1    2    3
0  NaN  5.0  5.0
1  NaN  NaN  NaN
2  1.0  NaN  1.0
3  2.0  4.0  3.0
...