我有一个CSV文件,其中包含100K +行数据,格式如下:
"{'foo':'bar' , 'foo1':'bar1', 'foo3':'bar3'}"
"{'foo':'bar' , 'foo1':'bar1', 'foo4':'bar4'}"
大括号前的引号是因为我的数据来自CSV文件。
我想提取所有行中的键值对以创建一个数据框,如下所示:
Column Headers: foo, foo1, foo3, foo...
Rows: bar, bar1, bar3, bar...
我尝试实现类似于此处(Python: error parsing strings from text file with Ast module)的解释。
我已经在文件上使用ast.literal_eval函数来将内容转换为字典,但是现在如何使DataFrame函数起作用?我是一个初学者,因此将不胜感激。
import pandas as pd
import ast
with open('file_name.csv') as f:
for string in f:
parsed = ast.literal_eval(string.rstrip())
print(parsed)
pd.DataFrame(???)
答案 0 :(得分:0)
您可以使用pd.DataFrame.from_dict将字典转换为pandas数据框,但是它将期望字典中的每个值都在列表中。
for key, value in parsed.items():
parsed[key] = [value]
df = pd.DataFrame.from_dict(parsed)
您可以通过附加到数据框来迭代地执行此操作。
df = pd.DataFrame()
for string in f:
parsed = ast.literal_eval(string.rstrip())
for key, value in parsed.items():
parsed[key] = [value]
df.append(pd.DataFrame.from_dict(parsed))
答案 1 :(得分:0)
parsed
是一本字典,您可以从中创建一个数据框,然后将所有框连接在一起:
df = []
with open('file_name.csv') as f:
for string in f:
parsed = ast.literal_eval(string.rstrip())
if type(parsed) != dict:
continue
subDF = pd.DataFrame(parsed, index=[0])
df.append(subDF)
df = pd.concat(df, ignore_index=True, sort=False)
在数据帧列表上调用pd.concat
比重复调用DataFrame.append
更快。 sort=False
表示pd.concat
不会在列名称遇到排序时对其进行排序,例如第二行的foo4
。