Условное создание нового столбца dataframe для отображения содержимого существующего столбца - PullRequest
0 голосов
/ 17 мая 2018

У меня есть датафрейм для панд, и он читается ниже

SKU  ClosingBalance
S1       10
S2       np.nan
S3       0
S4       20

Я хочу создать новый столбец, в котором будут отображаться только те SKU, у которых есть положительный баланс закрытия, а остальные должны быть помечены как np.nan, как показано ниже

SKU      ClosingBalance    SKU_CB
S1       10                S1
S2       np.nan            np.nan
S3       0                 np.nan
S4       20                S4

Я пытался

conditions = [(df['ClosingBalance'] > 1)]
df['SKU_CB'] = np.select(conditions, df['SKU'], default=np.nan)

Не работает. Нужна вся ваша помощь.

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Итак, ваши данные на самом деле содержат числовые данные с NaN, поэтому этого будет достаточно -

pd.Series.mask / where

df['SKU_CB'] = df.SKU.where(df.ClosingBalance.gt(0))

Или,

df['SKU_CB'] = df.SKU.mask(~df.ClosingBalance.gt(0))

df
  SKU  ClosingBalance SKU_CB
0  S1            10.0     S1
1  S2             NaN    NaN
2  S3             0.0    NaN
3  S4            20.0     S4

Если случайно ваши данные имеют значения NaN-ish, которые не являются точно NaN, то здесь есть альтернатива.Используя pd.to_numeric, определите, какие значения недопустимы, и используйте его для маскировки SKU.

pd.to_numeric с pd.Series.mask / where

df['SKU_CB'] = df.SKU.mask(
    ~pd.to_numeric(df.ClosingBalance, errors='coerce').gt(0)
)

Или,

df['SKU_CB'] = df.SKU.where(
   pd.to_numeric(df.ClosingBalance, errors='coerce').gt(0)
)

df
  SKU ClosingBalance SKU_CB
0  S1             10     S1
1  S2         np.nan    NaN
2  S3              0    NaN
3  S4             20     S4
0 голосов
/ 17 мая 2018

Вы можете сделать это с помощью np.where:

df['SKU_CB'] = np.where(df['ClosingBalance'] > 1, df['SKU'], np.nan)

В качестве альтернативы, при использовании np.select у вас, похоже, проблема со вторым параметром:

choicelist: список ndarrays Список массивов, из которых взяты выходные элементы. Он должен иметь ту же длину, что и condlist.

Так что, вероятно, должно быть

df['SKU_CB'] = np.select(conditions, [df['SKU']], default=np.nan)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...