2017-10-21 123 views
3

我有一个csv文件,它有很多列。一列包含字典对象形式的数据以及字符串。例如:列包含以下数据:{“a”:5,“b”:6,“c”:8},“usa”,“india”,{“a”:9,“b” :10,“C”:11}字典对象转换为字符串从csv读取数据时熊猫python

当我使用阅读本CSV成数据帧:

df = pd.read_csv(path) 

该列的数据被识别为字符串当我没有df.applymap(type) 检查每个类型元素存储在这个特定的列中。

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

在检查列的类型时,它变成了对象。

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

+1

这就是熊猫如何表示复杂的数据类型。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ这来自一个较早的问题,其中条目恰好是字符串而不是字典。我想这个可能突出显示的微妙差别是“a”而不是“a”! –

+1

@AndyHayden是的,我刚刚看到。感谢你丰富的答案,我从他们身上学到了很多。 –

回答

3

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

from ast import literal_eval 

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

现在,您可以将此到您的数据帧:

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对象,所以事情会比较慢......这可能是一个好主意反规范化即将数据返回为列e。 G。使用json_normalize

+0

我猜json_normalize的建议有点不必要,因为你来自这个问题https://stackoverflow.com/a/46856679/1240268 –

+0

我需要删除所有字符串行并将dict对象转换为列。所以,这个转换需要使用json_normalize。如上所述,我在数据框中有许多列,但我想要在特定列上应用地图事物,我如何在此代码中执行'df.applymap(try_literal_eval)'。像指定我的列名 –

+1

@NikitaGupta例如'df.A.apply(try_literal_eval)' –