Изменить dict в ячейке данных

1

У меня есть кадр данных 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
    Похоже, у вас есть представления словарей, хранящихся по всему вашему dataframe. Поэтому, если вы измените один, вы измените все остальные. Может быть, сделать тест, чтобы увидеть, если 1, A и 10, A являются одним и тем же объектом
  • 0
    чтобы добавить к комментарию @Yuca, вы должны думать о столбце dicts как о столбце указателей на dicts (и то, что вы увидите, произойдет, если две строки имеют одинаковое значение указателя)
Показать ещё 10 комментариев
Теги:
pandas
dataframe
dictionary
python-2.7

1 ответ

0

Как указано в комментариях, оба словаря в [1, "A"] и [10, "A"] одинаковы, поэтому вы не можете обновлять их без обновления другого.

Хотя я не понимаю, почему это происходит, глубокое копирование словаря в каждой ячейке решает проблему:

import copy
df = df.applymap(lambda d: copy.deepcopy(d))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню