Есть фрейм данных, и мне нужно replace значения выше 512 с 263.

Итак, я использовал эту строку кода, чтобы сначала отфильтровать свои индексы:

df.loc[df['Fare']>512]['Fare'].astype(int)

Вот результат этого:

258     512
679     512
737     512
1234    512
Name: Fare, dtype: int64

Это выглядит хорошо! поскольку он отфильтровал все 4 строки со значением выше 512. Теперь мне нужно заменить это значение на 263:

df.loc[df['Fare']>512]['Fare']=df.loc[df['Fare']>512]['Fare'].astype(int).replace({512:263},inplace=True)

Но это ничего не меняет в моем фрейме данных. Например, когда я ищу индекс 737, я нашел это:

df.iloc[737]

Результат:

Age                                35
Fare                          512.329

Таким образом, несмотря на вышеуказанные коды, Тариф не был изменен на 263.

0
Sadegh 2 Июл 2019 в 13:51

3 ответа

Лучший ответ

Удалите параметр inplace = True.

df.loc[df['Fare']>512]['Fare']=df.loc[df['Fare']>512]['Fare'].astype(int).replace({512:263})

Или просто не назначай.

df.loc[df['Fare']>512]['Fare'].astype(int).replace({512:263}, inplace=True)

Из замены документов:

на месте: bool, по умолчанию False
Если это правда, на месте. Примечание: это изменит любые другие представления этого объекта (например, столбец из DataFrame). Возвращает звонящего, если это правда.

К настоящему времени вы изменяете информационный фрейм на месте, но оператор присваивания = возвращает вызывающую функцию, поэтому вы переписываете свое редактирование с исходными значениями.

РЕДАКТИРОВАТЬ

На самом деле в моей версии (pandas 0.24.0) с inplace = True он ничего не возвращает, поэтому выделенное жирным шрифтом предложение может зависеть от версии (документы ссылаются на pandas 0.24.2).

В качестве примечания: фильтрация данных с помощью .loc и последующего использования replace является избыточной: .replace({512:263}) преобразует только значения 512, не нужно предварительно выбирать эти значения с помощью .loc.
Если вы делаете:

df['Fare'].astype(int).replace({512:263}, inplace=True)

Вы получаете тот же результат.

2
Valentino 2 Июл 2019 в 11:16

При использовании .loc вы хотите использовать [row, col], а не [row][col].

Пытаться:

df.loc[df['Fare']>512, 'Fare']=df.loc[df['Fare']>512, 'Fare'].astype(int).replace({512:263},inplace=True)
2
Adam.Er8 2 Июл 2019 в 10:53

Есть ли причина, по которой вы не просто делаете

condition = df['Fare'].astype(int) > 512
df.loc[condition, 'Fare'] = 263

condition является логическим рядом, и .loc присваивает только строки в этом ряду со значением True для требуемого значения.

2
absolutelydevastated 2 Июл 2019 в 10:57