经过详尽的搜索并尝试使其工作起来……我在这里。
我需要的摘要: 我需要创建和读取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
?
答案 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_csv
和df.read_csv
应该没问题。
我觉得有一个比我更想解决的方案,所以pandas
专家请多多关照。