Панды Если еще пусто - PullRequest
       3

Панды Если еще пусто

0 голосов
/ 18 октября 2018

В поисках решения для оператора if else в Pandas.Пример:

col1  col2
1     NAN
2     NAN
3     NAN
NaN   01-2019
2     NAN

Мой новый столбец должен быть col3;

  • Когда col1 = 1 или выше, добавьте «text a»
  • Когда col1 = пустои col2 = значение, принять значение col2
  • иначе;установить значение «текст б»

У меня сейчас только;когда col1 больше 1, задайте текст a, в противном случае текст b.

df['col3'] = np.where(df['col1']>=1, 'text a', 'text b')

Но пропущена часть, где можно проверить, является ли col1 пустым и имеет ли col2 значение.Чтобы поместить это значение в col3.

Как я могу этого достичь?

Спасибо!

- РЕДАКТИРОВАТЬ -

Спросил также в ответ на вопрос, когдаcol1 = 0 и col2 имеет значение, чтобы установить для col3 значение col2.

так же:

col1  col2
0     01-2019

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Еще один способ сделать это, кроме @jexrael, - использовать apply

In [27]: def condition(r):
    ...:     if r['col1'] >= 1: return "text a"
    ...:     if pd.isnull(r['col1']) and pd.notnull(r['col2']): return r['col2']
    ...:     return "text b"
    ...:

In [28]: df['col3'] = df.apply(condition, axis=1)

In [29]: df
Out[29]:
   col1     col2     col3
0   1.0      NaN   text a
1   2.0      NaN   text a
2   3.0      NaN   text a
3   NaN  01-2019  01-2019
4   2.0      NaN   text a
0 голосов
/ 18 октября 2018

Используйте numpy.select с пропущенными и не пропущенными значениями теста по Series.isna и Series.notna:

print (df)
   col1     col2
0   0.0      NaN <-added row for test all coditions failed
1   1.0      NaN
2   2.0      NaN
3   3.0      NaN
4   NaN  01-2019
5   2.0      NaN

m1 = df['col1'] > =1
m2 = df['col1'].isna() & (df['col2'].notna())
#oldier pandas versions
#m2 = df['col1'].isnull() & (df['col2'].notnull())
df['col3'] = np.select([m1, m2], ['text a', df['col2']], 'text b')
print (df)
   col1     col2     col3
0   0.0      NaN   text b
1   1.0      NaN   text a
2   2.0      NaN   text a
3   3.0      NaN   text a
4   NaN  01-2019  01-2019
5   2.0      NaN   text a

Другое решение с двойной np.where:

df['col3'] = np.where(m1, 'text a',
             np.where(m2, df['col2'], 'text b'))

РЕДАКТИРОВАТЬ:

Условие изменено:

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