Вложенные операторы if с .loc в pandas / python - PullRequest
0 голосов
/ 26 апреля 2018

Я использую if в условном выражении, подобном приведенному ниже коду.Если адрес равен NJ, то значение столбца имени меняется на «N / A».

df1.loc[df1.Address.isin(['NJ']), 'name'] = 'N/A'

Как мне сделать то же самое, если я «вложил, если утверждения», как показано ниже?

# this not code just representing the logic
if address isin ('NJ', 'NY'):
    if name1 isin ('john', 'bob'):
        name1 = 'N/A' 
    if name2 isin ('mayer', 'dylan'):
        name2 = 'N/A'

Можно ли добиться вышеупомянутой логики, используя df.loc?Или есть другой способ сделать это?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Отдельные назначения, , как показано @MartijnPeiters, являются хорошей идеей для небольшого числа условий.

Для большого числа условий рассмотрите возможность использования numpy.select для разделенияусловия и выбор.Это должно сделать ваш код более читабельным и простым в обслуживании.

Например:

import pandas as pd, numpy as np

df = pd.DataFrame({'address': ['NY', 'CA', 'NJ', 'NY', 'WS'],
                   'name1': ['john', 'mayer', 'dylan', 'bob', 'mary'],
                   'name2': ['mayer', 'dylan', 'mayer', 'bob', 'bob']})

address_mask = df['address'].isin(('NJ', 'NY'))

conditions = [address_mask & df['name1'].isin(('john', 'bob')),
              address_mask & df['name2'].isin(('mayer', 'dylan'))]

choices = ['Option 1', 'Option 2']

df['result'] = np.select(conditions, choices)

print(df)

  address  name1  name2    result
0      NY   john  mayer  Option 1
1      CA  mayer  dylan         0
2      NJ  dylan  mayer  Option 2
3      NY    bob    bob  Option 1
4      WS   mary    bob         0
0 голосов
/ 26 апреля 2018

Используйте отдельные назначения.У вас есть различные условия для фильтрации, вы можете комбинировать address и два name* фильтра с & (но ставьте скобки вокруг каждого теста):

df1.loc[(df1.Address.isin(['NJ'])) & (df1.name1 isin ('john', 'bob')), 'name1'] = 'N/A'
df1.loc[(df1.Address.isin(['NJ'])) & (df1.name2 isin ('mayer', 'dylan')), 'name2'] = 'N/A'

Вы всегда можете сохранить логическое значениеСначала фильтры в переменной:

nj_address = df1.Address.isin(['NJ'])
name1_filter = df1.name1 isin ('john', 'bob')
name2_filter = df1.name2 isin ('mayer', 'dylan')
df1.loc[nj_address & name1_filter, 'name1'] = 'N/A'
df1.loc[nj_address & name2_filter, 'name2'] = 'N/A'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...