Записывать и читать CSV-файлы с помощью Pandas, где определенное значение ячейки столбца может быть списком диктов - PullRequest
0 голосов
/ 10 октября 2018

После исчерпывающего поиска и попытки заставить его работать ... вот и я.

Резюме того, что мне нужно: мне нужно создавать и читать файлы CSV, чтобы я мог свободно манипулировать данными из файлов,Например:

row1 = {"col1": "value1", "col2": 0.5, "col3": [{"key1": 0.2}, {"key2": 0.3}]
df = pandas.DataFrame(row1, columns=["col1", "col2", "col3"]
df.to_csv("test.csv")

Файл, который я получаю, выглядит так:

    col1    col2    col3
0   value1  0.5   [{'key1': 0.2}, {'key2': 0.3}]

После этого я могу прочитать файл с:

df = pandas.read_csv("test.csv")

Проблемыприходят с такими случаями, как col3.Я глупо думал, что когда я преобразую фрейм данных:

df = list(df.T.to_dict().values())

, я смогу получить доступ к col3 с помощью:

for row in df:
    wanted_data = row["col3"]

Я думал, что получу список с двумя словарями в нем,На самом деле я получаю строку.

Как я могу получить доступ к key1, key2 (ключи разные) и их соответствующим значениям?Я уже пробовал с:

json.loads(wanted_data)

Но независимо от того, что я делаю, я получаю такие ошибки:

Traceback (most recent call last):
  File "<pyshell#230>", line 1, in <module>
    now("tst_2.csv")
  File "D:\test_DUAL_up_to_RoleMap_official_edition - Copy\kb_test_manipulation.py", line 84, in now
    res = json.loads(new_supercl)
  File "C:\Users\NOTEBOOK2\AppData\Local\Programs\Python\Python35-32\lib\json\__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "C:\Users\NOTEBOOK2\AppData\Local\Programs\Python\Python35-32\lib\json\decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\NOTEBOOK2\AppData\Local\Programs\Python\Python35-32\lib\json\decoder.py", line 355, in raw_decode
    obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 3 (char 2)

Любые идеи, как я должен хранить и /или читать данные, чтобы я мог правильно получить доступ к col3?

1 Ответ

0 голосов
/ 10 октября 2018

Проблема в том, что при сохранении исходного DataFrame он уже сохранял столбец 3 в виде строк.Ваш CSV на самом деле выглядит так:

    col1    col2    col3
0   value1  0.5     {'key1': 0.2}
1   value1  0.5     {'key2': 0.3}

                    # Note this column is string.

Поэтому, когда вы читаете его, col3 дает вам str объект вместо dict, как вы могли ожидать.

если нет явной причины хранить col3 как строковое представление словаря, сохраняйте только значение.Вы должны обновить row1['col3'], чтобы отразить это вместо этого:

{'col1': 'value1', 'col2': 0.5, 'col3': [0.2, 0.3]}

Предполагая, что у вас есть только словарь с одним ключом в каждом элементе col3, вы можете преобразовать его так:

row1['col3'] = [[i for i in v.values()][0] for v in row1['col3']]

Чтобы ваш df теперь давал вам только значения словаря:

     col1  col2  col3
0  value1   0.5   0.2
1  value1   0.5   0.3

После этого ваши df.to_csv и df.read_csv должны быть в порядке.

Я чувствую, что есть более очевидное решение, чем я пропускаю, поэтому любой pandas эксперт, пожалуйста, присоединяйтесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...