Застрял с TypeError: не удается сравнить типы ‘ndarray (dtype = object)’ и ‘str’

#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)