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



经过详尽的搜索并试图使其工作...我来了。

我需要的摘要: 我需要创建和读取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 - Copykb_test_manipulation.py", line 84, in now
res = json.loads(new_supercl)
File "C:UsersNOTEBOOK2AppDataLocalProgramsPythonPython35-32libjson__init__.py", line 319, in loads
return _default_decoder.decode(s)
File "C:UsersNOTEBOOK2AppDataLocalProgramsPythonPython35-32libjsondecoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:UsersNOTEBOOK2AppDataLocalProgramsPythonPython35-32libjsondecoder.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的任何想法?

问题是当您保存初始数据帧时,它已经将第 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专家请插话。

相关内容

最新更新