当从csv读取到dataframe pandas时,dict对象转换为字符串python

时间:2017-10-21 00:09:04

标签: python pandas csv dictionary dataframe

我有一个csv文件,它有很多列。一列包含dict对象和字符串形式的数据。

例如:列包含如下数据:{“a”:5,“b”:6,“c”:8},“usa”,“india”,{“a”:9,“b”: 10, “C”:11}

当我使用以下内容将此csv读入数据框时

df = pd.read_csv(path)

当我执行df.applymap(type)时,此列数据被识别为字符串 检查存储在此特定列中的每个元素的类型。

但是数据在csv和数据帧中都没有引号。但仍然将dict对象转换为字符串并存储在数据帧中。

在检查列的类型时,结果是对象。

请建议如何从csv读入数据帧,以便在此特定列中将dict对象识别为字典和字符串作为字符串。

1 个答案:

答案 0 :(得分:4)

您可以使用literal_eval转换应该是dicts(或其他类型)的字符串:

from ast import literal_eval

def try_literal_eval(s):
    try:
        return literal_eval(s)
    except ValueError:
        return s

现在您可以将其应用于您的DataFrame:

In [11]: df = pd.DataFrame({'A': ["hello","world",'{"a":5,"b":6,"c":8}',"usa","india",'{"d":9,"e":10,"f":11}']})

In [12]: df.loc[2, "A"]
Out[12]: '{"a":5,"b":6,"c":8}'

In [13]: df
Out[13]:
                       A
0                  hello
1                  world
2    {"a":5,"b":6,"c":8}
3                    usa
4                  india
5  {"d":9,"e":10,"f":11}


In [14]: df.applymap(try_literal_eval)
Out[14]:
                            A
0                       hello
1                       world
2    {'a': 5, 'b': 6, 'c': 8}
3                         usa
4                       india
5  {'d': 9, 'e': 10, 'f': 11}

In [15]: df.applymap(try_literal_eval).loc[2, "A"]
Out[15]: {'a': 5, 'b': 6, 'c': 8}

注意:就其他调用来说,这是非常昂贵的(按时间),但是当您在DataFrames / Series中处理字典时,您必须默认返回到python对象,所以事情进展顺利相对较慢......反规范化可能是一个好主意,即将数据作为列返回,例如使用json_normalize