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

3

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

可能是将字典的字符串表示转换为字典?的重复问题。 - eva-vw
将每行数据框中的字典附加到此处。 - Mohit Rajpoot
2个回答

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))

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表示当遇到像第二行的foo4这样的少数列名时,pd.concat不会对其进行排序。


这很有道理!我尝试了一下,但出现了一个ValueError: DataFrame constructor not properly called!的错误。也许是因为parsed仍然被视为字符串?当我尝试检查type(parsed)时,返回的是str。 - trynagetajob
那似乎是个错误。如果parsed无法转换为字典,可以忽略这行代码吗? - Code Different
这是我注意到的一件事。当我从我的数据集中单独添加一行时,运行ast.literal_eval后它会被转换为字典。但是当我尝试对整个文件运行ast.literal_eval并在之后检查type()时,返回的是str类型。 - trynagetajob
我应该忽略哪一行? - trynagetajob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接