У меня есть кадр данных pandas. В каждой клетке есть dict:
id | A | B | ...
1 | {"a": 1, "b":1} |{"d": 1, "e":1} | ...
2 | {"a": 2, "b":3} |{"d": 5, "e":6} | ...
...
10 | {"a": 1, "b":1} |{"d": 1, "e":3} | ...
Я хотел бы обновить одну ячейку (ei 1, A):
df.loc[1,"A"].update({"c":2})
Эта процедура обновляет каждую отдельную ячейку, которая имеет тот же самый dict, поэтому в этом случае будет (1, A и 10, A будет изменено):
id | A
1 | {"a": 1, "b":1, "c":2}
2 | {"a": 2, "b":3}
...
10 | {"a": 1, "b":1, "c":2}
Как заставить python обновлять только 1, A?
Вот как я создаю фрейм данных:
df = pd.read_csv( file_path, sep='\t', names=['id', 'A'], compression='gzip', converters={1:ast.literal_eval})
Как указано в комментариях, оба словаря в [1, "A"]
и [10, "A"]
одинаковы, поэтому вы не можете обновлять их без обновления другого.
Хотя я не понимаю, почему это происходит, глубокое копирование словаря в каждой ячейке решает проблему:
import copy
df = df.applymap(lambda d: copy.deepcopy(d))