Альтернатива вложенным операторам np.where для сохранения значений NaN при создании нового логического столбца pandas на основе двух других существующих столбцов - PullRequest
0 голосов
/ 06 июля 2019

Я пытаюсь найти более простую альтернативу для оценки и создания нового столбца в кадре данных pandas на основе двух других столбцов, которые содержат значения True, False или NaN. Я хочу, чтобы новый столбец оценивался следующим образом относительно двух ссылочных столбцов:

  • Если либо True -> True
  • Если хотя бы один False и ни один True -> False
  • Если оба NaN -> NaN

Я нашел решение, используя несколько вложенных операторов np.where, но предпочел бы более простой подход. Для одного ссылочного столбца я разобрался, как это сделать (см. Ниже показанное как col4), но не могу понять, есть ли способ приспособить это к разложению на несколько ссылочных столбцов.

Текущее решение:

import pandas as pd
import numpy as np

d = {'col1': [True, True, True, False, False, False, np.nan, np.nan, np.nan],
     'col2': [True, False, np.nan,True, False, np.nan,True, False, np.nan]}
df = pd.DataFrame(data=d)

df['col3'] = np.where(
    pd.notnull(df['col1']) & pd.notnull(df['col2']),
    (df['col1'] == True) | (df['col2'] == True),
    np.where(
        pd.isnull(df['col1']) & pd.isnull(df['col2']),
        np.nan,
        np.where(pd.notnull(df['col1']),df['col1'],df['col2'])
    )
)

Single Reference Column Решение:

df['col4'] = df['col1'].map(lambda x: x, na_action='ignore')

1 Ответ

1 голос
/ 06 июля 2019

np.select() сделано для этого типа работы:

df['col3'] = pd.Series(np.select(
    [(df.col1 == True) | (df.col2 == True), (df.col1 == False) | (df.col2 == False)],
    [True, False], np.array(np.nan, object)))

Или, используя только панд, но я думаю, что этот способ менее читабелен:

df['col3'] = df.col1.where(df.col1, df.col2.where(df.col2.notnull(), df.col1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...