У меня есть код, в котором функция/метод принимает серию (строку из df) и должна изменять ее на месте, чтобы изменения отражались в исходном df. Однако мне кажется, что я не могу принудительно изменить вид, а не копию. Информация из документации. и связанный вопрос о переполнении стека не разрешаются проблема, как показано в примере ниже:
import pandas as pd
pd.__version__ # 0.24.2
ROW_NAME = "r1"
COL_NAME = "B"
NEW_VAL = 100.0
# df I would like to modify in-place
df = pd.DataFrame({"A":[[1], [2], [3,4]], "B": [1.0, 2.0, 3.0]}, index=["r1", "r2", "r3"])
# a row (Series reference) is the input param to a function that should modify df in-place
record = df.loc[ROW_NAME]
record.loc[COL_NAME] = NEW_VAL
assert df.loc[ROW_NAME, COL_NAME] == NEW_VAL #False
Строка, начинающаяся с record.loc
, приводит к знакомому предупреждению: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame
, что может иметь смысл, за исключением того, что record
появляется как ссылка на df
и при некоторых обстоятельствах может быть изменена на месте. Пример этого:
record = df.loc[ROW_NAME]
record.loc["A"].append(NEW_VALUE)
assert NEW_VALUE in df.loc["r1", "A"] # True
Мой вопрос: как я могу принудительно изменить значение с плавающей запятой в df.loc[ROW_NAME, COL_NAME]
на месте из серии record
? Бонусные баллы за разъяснение того, почему можно изменить столбец A на месте, но не столбец B в приведенных выше примерах.
Другие сопутствующие вопросы: