Замена значений внутри списка

#python #pandas

#python #панды

Вопрос:

У меня есть фрейм данных pandas, где столбец представляет собой список. Я пытаюсь заменить значение внутри этого списка с помощью метода replace, но безуспешно. Я пытаюсь заменить строку other любым значением

 df = pd.DataFrame({'sales_niche' : [['B2B', 'Services', 'Services', 'Other', 'Other']]})


df['sales_niche'].replace('Other','Any value')
df['sales_niche'].replace({ 'Other': 'Any value' })
  

выходной сигнал

 0        [B2B, Services, Services, Other, Other]
  

Есть идеи о том, что я делаю не так? При работе со столбцами, которые не являются списками, это работает нормально. Любая помощь приветствуется.

Спасибо!

Комментарии:

1. Должно быть легко создать небольшой пример фрейма данных и показать нам в коде, что вы делаете.

2. Просто сделал это, спасибо.

Ответ №1:

replace работает только с точными значениями или подстрокой, если regex=True . В вашем случае у вас есть список строк, поэтому replace это не будет хорошим выбором.

Как правило, следует избегать списков внутри фрейма данных. Если вам необходимо его использовать, вы можете просто выполнить цикл:

 df = pd.DataFrame({'sales_niche':[['B2B', 'Services', 'Services', 'Other', 'Other']]})

d = { 'Other': 'Any value' }

df['sales_niche'].apply(lambda x: [d[a] if a in d else a for a in x])
  

Вывод:

 0    [B2B, Services, Services, Any value, Any value]
Name: sales_niche, dtype: object
  

Вы также можете разделить свои данные и использовать replace , а затем агрегировать обратно:

 df['sales_niche'].explode().replace(d).groupby(level=0).agg(list)
  

но накладные расходы могут сделать этот подход не таким полезным, как простое применение выше.

Ответ №2:

Используя этот фрейм данных в качестве примера

 df = pd.DataFrame({'sales_niche' : [['B2B', 'Services', 'Services', 'Other', 'Other']]})
  

запуск этого кода

 repl = { 'Other': 'Any value' }
df['sales_niche'] = df['sales_niche'].apply(lambda l:[repl.get(e,e) for e in l])
df
  

дает вам это

 
sales_niche
0   [B2B, Services, Services, Any value, Any value]