Python Dataframe;проблема изменения значения столбца с несколькими фильтрами - PullRequest
0 голосов
/ 10 декабря 2018

У меня большой фрейм данных, я снял базу данных ODBC.Dataframe имеет несколько столбцов;Я пытаюсь изменить значения одного столбца, отфильтровывая два других.Сначала я фильтрую свой dataframe data_prem по обоим условиям, что дает мне правильные строки:

data_prem[(data_prem['PRODUCT_NAME']=='ŽZ08') & (data_prem['BENEFIT'].str.contains('19.08.16'))]

Затем я использую функцию замены в выделении, чтобы изменить значение 'M' на значение 'H':

data_prem[(data_prem['PRODUCT_NAME']=='ŽZ08') & (data_prem['BENEFIT'].str.contains('19.08.16'))]['Reinsurer'].replace(to_replace='M',value='H',inplace=True,regex=True)

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

фильтрация данных кадра

Я также попытался использовать функцию .loc следующим образом:

data_prem.loc[((data_prem['PRODUCT_NAME']=='ŽZ08') & (data_prem['BENEFIT'].str.contains('19.08.16'))),'Reinsurer'] = 'H'

, которая изменила все строки, соответствующие второму условию (str.contains...), но это не применимо к первому условию.Я получил замены в столбце «Перестраховщик» для других значений «PRODUCT_NAME».

В течение некоторого времени я искал в Интернете ответ на этот вопрос.Я видел некоторые упоминания об ошибке в библиотеке панд, не уверен, что именно об этом они и говорили.

Я был бы признателен за любые ваши мнения, также были бы интересны альтернативные способы решения этой проблемы.проблема.Я заполнил столбец «Reinsurer» функцией карты с «PRODUCT_NAME» в качестве входных данных (имел словарь, который соединил все значения «PRODUCT_NAME» со значениями «Reinsurer»).

1 Ответ

0 голосов
/ 10 декабря 2018

Учитывая ваш логический mask, вы продемонстрировали два способа применения цепной индексации .Это является причиной предупреждения и причиной того, что вы не видите, как ваша логика применяется так, как вы ожидаете.

mask = (data_prem['PRODUCT_NAME']=='ŽZ08') & df['BENEFIT'].str.contains('19.08.16')

Цепная индексация: Пример # 1

df[mask]['Reinsurer'].replace(to_replace='M', value='H', inplace=True, regex=True)

Цепная индексация: Пример # 2

df[mask].loc[mask, 'Reinsurer'] = 'H'

Избегайте цепной индексации

Вы можете упростить задачу, применив один раз mask и используя один вызов loc:

df.loc[mask, 'Reinsurer'] = 'H'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...