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