Попробуйте вместо этого использовать .loc [row_indexer, col_indexer] = value

При использовании python что-то не так.

 resource1   #"dataframe"

а также,

resource1.loc[(resource1["code"] == ""), "code"] = "nocode"

тогда здесь появляется сообщение об ошибке.

~ / anaconda3 / lib / python3.6 / site-packages / pandas / core / indexing.py: 537: SettingWithCopyWarning: значение пытается быть установлено на копии фрагмента из DataFrame. Попробуйте вместо этого использовать .loc [row_indexer, col_indexer] = value См. Предостережения в документации: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-скопируйте self.obj [item] = s

Что не так с кодом?


person JINWOO LEE    schedule 26.04.2018    source источник
comment
Вам нужно опубликовать свои данные, код для воспроизведения вашего df и код, который воспроизводит вашу ошибку, глядя на ваш скудный код, зачем вам () вокруг логической маски? это работает: resource1.loc[resource1["code"] == "", "code"] = "nocode"   -  person EdChum    schedule 26.04.2018
comment
Как писал @EdChum, вам нужно показать, как вы сгенерировали свои данные. Глядя на ваши сообщения об ошибках, можно предположить, что вы, вероятно, создали resource1, используя срез, например: resource1 = resource1.loc[resource1["Code"] == "special_code"]   -  person ec2604    schedule 26.04.2018


Ответы (1)


Если вы создали resource1 из другого источника, например так:

# original DattaFrame
resource = pd.DataFrame({'code':['aaa', "", 'bb', 'nbn']})
# new DataFrame 
resource1 = resource[resource['code'].str.len()<3]

Вы получаете предупреждающее сообщение (но resource1 был изменен). Причина, вероятно, в том, что resource1 создается как фильтр из resource, и неясно, возвращает ли он копию или представление - вместо этого ссылка на resources новой переменной (см. эту ссылку подробнее). Чтобы избежать этого, вы можете использовать функцию deepcopy

import copy
resource1 = copy.deepcopy(resource[resource['code'].str.len()<3])

Это безопасно создает новый DataFrame с отфильтрованными данными и вашим кодом.

resource1.loc[(resource1["code"] == ""), "code"] = "nocode"

будет работать без предупреждения.

Или вы можете отключить привязанное назначение, чтобы достичь того же (но предупреждения не просто раздражают, поэтому внимательно рассмотрите вариант ...)

pandas.options.mode.chained_assignment = None
person Lukas    schedule 10.09.2019