#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()
beforedf['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
?