使用Pandas写入和读取csv文件,其中特定的列单元格值可以是字典列表

时间:2018-10-10 18:10:32

标签: python pandas

经过详尽的搜索并尝试使其工作起来……我在这里。

我需要的摘要: 我需要创建和读取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"]

我想我会得到一个包含两个字典的列表。 我实际上得到的是一个字符串。

如何访问key1key2(键是不同的)及其对应的值? 我已经尝试过:

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 :(得分:0)

问题是,当您保存初始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_csvdf.read_csv应该没问题。

我觉得有一个比我更想解决的方案,所以pandas专家请多多关照。