Python Pandas: замена значений в столбце

#python #pandas

#python #панды

Вопрос:

У меня есть столбец в a DataFrame , значения которого я хочу изменить. Вызывая DataFrame df и предполагая, что один столбец помечен A , я делаю:

 df.A = df.A.map(lambda x: -x)
 

Это приводит к фактическому выполнению операции, однако это также приводит к следующему предупреждению:

 SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  self[name] = value
 

Хорошо, тогда я пытаюсь использовать то, что предложено в предупреждении, и пишу:

 df.loc[:,'A'] = df.A.map(lambda x: -x)
 

Только для того, чтобы получить точно такое же предупреждение

 SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  self.obj[item] = s
 

Хорошо, последняя строка немного отличается, но я не знаю, как ее интерпретировать.
Почему я получаю SettingWithCopyWarning четность, когда я использую .loc , как и было запрошено?

Затем я попробовал третий метод:

  • создайте новый столбец с данными
  • удалите старый столбец
  • переименуйте новый столбец со старым именем

«

 df['new'] = df.A.map(lambda x: -x)
df.drop('A',axis=1,inplace=True)
df.rename(columns={'new':'A'},inplace=True)
 

И снова! Я все еще получаю предупреждение:

 SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  return super().rename(
 

На данный момент я не понимаю, как правильно заменить столбец другими значениями?
Я упускаю какой-то важный аспект фреймворка? Я просто не должен пытаться использовать существующее имя столбца для других данных?

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

1. О чем df['A'] = df['A'].map(lambda x: -x) это ? или просто df['A'] = -1 * df['A']

2.Вы должны добавить df = df.copy() before df['new'] = ... при определении своего фрейма данных. Кроме того, я думаю df['A'] = -df['A'] , что это намного лучше, хотя вам все равно нужно copy() .

3. IIUC, проблема не в текущем коде, а в том, как был сгенерирован этот df. Нужно увидеть этот код, чтобы быть уверенным. Также карта не нужна, вы можете просто умножить столбец на -1

4. @DaniMesejo ваше предложение дает точно такой же результат:-/ — Он изменяет DF, но выдает то же предупреждение. @QuangHoang df['A'] = - df['A'] выдает то же предупреждение — почему я должен это делать df = df.copy() ?

5.@Vaishali Я думаю, что вы, возможно, указали мне правильное место, хотя я не уверен, как это работает. Предложенное df мной является вымышленным. Реальный генерируется чем-то вроде этого: df_master = pd.read_csv('file') df = df_master[df_master['column_x'] == 'val_x'] это проблема? Потому что я использую .loc представление оригинала df_master ?