заменить значение столбца константой, если значение value_count для этой категории меньше 10 питонов - PullRequest
0 голосов
/ 01 октября 2018

Я хочу заменить все категории в кадре данных pandas на «Другие», если значение для этой категории меньше 10.

Я пытаюсь что-то вроде этого.

df['variable'].where(df['variable'].apply(lambda x: x.map(x.value_counts()))<=10, "other")

Но я получаю следующую ошибку:

AttributeError: 'str' object has no attribute 'map'

1 Ответ

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

Вы можете рассчитать количество отсчетов для каждого значения с помощью pd.Series.value_counts, а затем идентифицировать подсчеты ниже предела.Затем используйте pd.DataFrame.loc с логическим индексированием:

counts = df['variable'].value_counts()
idx = counts[counts.lt(10)].index

df.loc[df['variable'].isin(idx), 'A'] = 'Others'

В общем, вам следует избегать apply + lambda, так как это не векторизация и чуть больше, чем тонко завуалированная петля.Вот рабочий пример с числовыми данными и добавленными столбцами для демонстрации логики:

np.random.seed(0)

arr = np.random.randint(0, 12, 100)
df = pd.DataFrame({'A': arr, 'B': arr})

counts = df['A'].value_counts()
idx = counts[counts.lt(10)].index

df['counts'] = df['A'].map(counts)
df.loc[df['A'].isin(idx), 'B'] = -1

print(df)

     A  B  counts
0    5 -1       9
1    0 -1       9
2    3  3      14
3   11 -1       5
4    3  3      14
5    7  7      10
6    9 -1       9
7    3  3      14
8    5 -1       9
9    2 -1       5
10   4  4      13
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...