#python #python-3.x #string #pandas #numpy
#python #python-3.x #строка #pandas #numpy
Вопрос:
У меня есть поле, сохраненное как object в моем df, и я пытаюсь заменить низкочастотные значения на ‘other’ с помощью следующего кода:
cols = ['Keyword']
for col in cols:
val = df_ch[col].value_counts()
y = val[val < 10000].index
df_ch[col] = df_ch[col].replace({x:'other' for x in y})
Но у меня продолжает возникать эта ошибка:
TypeError: Cannot compare types 'ndarray(dtype=object)' and 'str'
Чего я не понимаю?
Вот как выглядит файл:
df_ch['Keyword'].head(20)
Out[55]:
0 (not provie)
1 (not provie)
2 (not set)
3 (not set)
4 (not provie)
5 (not provie)
6 (not set)
7 (not set)
8 keyword1
9 (not provie)
10 (not set)
11 (not set)
12 (not provie)
13 (not provie)
14 (not set)
15 (not provie)
16 (not provie)
17 display
18 (not provie)
19 (not provie)
Name: Keyword, dtype: object
Ответ №1:
IIUC, вы хотите заменить имена групп на Other
, если их количество меньше определенного числа.
В вашем методе неправильно используется replace
функция. В этом случае вам следует передать словарь в качестве входных данных, который имеет сопоставление значений столбцов:
df_ch.replace({'Keyword': {x:'other' for x in y}}, inplace=True)
Вот другой подход без цикла
Сначала посчитайте числа
x = df_ch['Keyword'].value_counts().reset_index()
# index 0
#0 (not provie) 11
#1 (not set) 7
#2 keyword1 1
#3 display 1
Затем назначьте Other
группам, количество которых ниже определенного порога (здесь 5).
df_ch.loc[df_ch['Keyword'].isin(x['index'].loc[x['Keyword']<5]), 'Keyword']='Other'
df_ch['Keyword']
0 (not provie)
1 (not provie)
2 (not set)
3 (not set)
4 (not provie)
5 (not provie)
6 (not set)
7 (not set)
8 Other
9 (not provie)
10 (not set)
11 (not set)
12 (not provie)
13 (not provie)
14 (not set)
15 (not provie)
16 (not provie)
17 Other
18 (not provie)
19 (not provie)