Панды условного творчества, исключая - PullRequest
0 голосов
/ 16 мая 2018

У меня есть следующий фрейм данных

col1 col2 col3
a    b    c
d    e    f
g    h    i

Я пишу следующее

df['col1'] = np.where((df['col2'].str.contains('b',case = False,regex=True,na=False)) & 
                      (df['col3'].str.contains('c',case = False,regex=True,na=False)),'s', 'o')

Теперь я получил это

col1 col2 col3
s    b    c
o    e    f
o    h    i

Теперь я хочу сделать следующее, где col1 НЕ равно s

df['col1'] = np.where((df['col1'] != 's') &
                      (df['col2'].str.contains('e',case = False,regex=True,na=False)) & 
                      (df['col3'].str.contains('f',case = False,regex=True,na=False)),'z','x')

Я хочу следующее

col1 col2 col3
s    b    c
z    e    f
x    h    i

Но я получаю это вместо

col1 col2 col3
x    b    c
z    e    f
x    h    i

Я хочу, чтобы логика не меняла s в col1

1 Ответ

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

Может быть другое эффективное решение, может быть, вы можете попробовать использовать следующее, где, если col1 равно s, тогда возвращается s, иначе применяется np.where с другим условием:

df['col1'] = np.where((df['col1'] == 's'), 's', 
                      np.where((df['col2'].str.contains('e',case = False,regex=True,na=False)) & 
                               (df['col3'].str.contains('f',case = False,regex=True,na=False)),
                                'z','x')
                     ) 
print(df)

Результат:

  col1 col2 col3
0    s    b    c
1    z    e    f
2    x    h    i

Обновление:

Для большего условия все еще с where:

df['col1'] = np.where((df['col1'] == 's'), 's', 
                      np.where((df['col1'] == 'z'), 'z',
                      np.where((df['col2'].str.contains('e',case = False,regex=True,na=False)) & 
                               (df['col3'].str.contains('f',case = False,regex=True,na=False)),
                                'z','x')
                               )
                     ) 
print(df)

Использование apply:

Сначала мы можем создать функцию, а затем применить к dataframe:

def function(row):
    if row['col1'] == 's':
        return 's'
    elif row['col1'] == 'z':
        return 'z'
    elif ('e' in row['col2'].lower()) and 'f' in row['col3'].lower():
        return 'z'
    else:
        return 'x'

Теперь примените функцию к фрейму данных:

df['col1'] = df.apply(function, axis=1)
print(df)

Результат:

  col1 col2 col3
0    s    b    c
1    z    e    f
2    x    h    i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...