将字典的字符串表示形式转换为实际的字典

时间:2019-07-26 19:06:51

标签: python python-3.x pandas

我有一个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(???)

2 个答案:

答案 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