как я могу достичь чего-то вроде np.where (df [varaible] в ['value1', 'value2']) - PullRequest
0 голосов
/ 30 декабря 2018

Привет! Я хочу изменить значение одной категориальной переменной на other в условии, как ['value1','value2']

Вот мой код:

random_sample['NAME_INCOME_TYPE_ind'] = np.where(random_sample['NAME_INCOME_TYPE'] in ['Maternity leave', 'Student']), 'Other')

Я попытался добавить .any() вдругая позиция этой строки кода, но она по-прежнему не устраняет ошибку.ValueError: Значение истинности Серии неоднозначно.Используйте a.empty, a.bool (), a.item (), a.any () или a.all ().

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

Используйте Категориальные данные для категориальных переменных

При работе с категориями вы можете заменить категории другой, а не заменять строки.Это дает преимущества в плане памяти и производительности, поскольку внутренне Pandas использует факторизацию для категориальных данных.

df = pd.DataFrame({'NAME_INCOME_TYPE': ['Employed', 'Maternity leave',
                                        'Benefits', 'Student']})

# turn object series to categorical
label_col = 'NAME_INCOME_TYPE'
df[label_col] = df[label_col].astype('category')

# define others
others = ['Maternity leave', 'Student']
others_label = 'Other'

# add new category and replace existing categories
df[label_col] = df[label_col].cat.add_categories([others_label])
df[label_col] = df[label_col].replace(others, others_label)

print(df)

  NAME_INCOME_TYPE
0         Employed
1            Other
2         Benefits
3            Other

Вы также можете написать это более кратко, используя цепочку методов:

# define others
others, others_label = ['Maternity leave', 'Student'], 'Other'

# turn to categorical, add category, then replace
df['NAME_INCOME_TYPE'] = df['NAME_INCOME_TYPE'].astype('category')\
                                               .cat.add_categories([others_label])\
                                               .replace(others, others_label)
0 голосов
/ 30 декабря 2018

Вы можете использовать str.contains, чтобы проверить, где выполняется условие:

l = ('|').join(['Maternity leave', 'Student'])
m = random_sample['NAME_INCOME_TYPE'].str.contains(l)

Вы также можете сгенерировать m, используя .isin:

random_sample['NAME_INCOME_TYPE'].isin(['Maternity leave', 'Student'])

А затем используйте np.where.Однако учтите, что вы не можете указать только одно из двух значений, из которых можно выбирать, в зависимости от условия, вы должны указать и x, и y.Для вашего случая вы можете использовать df['NAME_INCOME_TYPE'] и other в качестве x и y:

random_sample['NAME_INCOME_TYPE_ind'] = np.where(m, 
                                                'Other',
                                                random_sample['NAME_INCOME_TYPE'])

Тест на примере кадра данных:

df = pd.DataFrame({'NAME_INCOME_TYPE':['word1','word2','Student']})

l = ('|').join(['Maternity leave', 'Student'])
m = random_sample['NAME_INCOME_TYPE'].str.contains(l)
df['NAME_INCOME_TYPE_ind'] = np.where(m, 'Other', df['NAME_INCOME_TYPE'])

       NAME_INCOME_TYPE NAME_INCOME_TYPE_ind
0            word1                word1
1            word2                word2
2          Student                Other
...