从csv读取到数据框pandas python时,dict对象转换为字符串
Posted
技术标签:
【中文标题】从csv读取到数据框pandas python时,dict对象转换为字符串【英文标题】:dict objects converting to string when read from csv to dataframe pandas python 【发布时间】:2018-04-02 04:48:53 【问题描述】:我有一个 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 对象识别为 dict 并将字符串识别为该特定列中的字符串。
【问题讨论】:
这就是 pandas 表示复杂数据类型的方式。 @cᴏʟᴅsᴘᴇᴇᴅ 这来自较早的问题,其中条目恰好是字符串而不是字典。我想可能突出显示的是“a”而不是“a”的细微差别! @AndyHayden 是的,我刚刚看到了。感谢您丰富的答案,我从他们身上学到了很多东西。 【参考方案1】:您可以使用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
。
【讨论】:
我猜 json_normalize 建议有点不必要,因为你来自这个问题***.com/a/46856679/1240268 我需要删除所有字符串行并将 dict 对象转换为列。因此,对于这种转换需要使用 json_normalize。如前所述,我在数据框中有很多列,但我想在特定列上应用地图,我该如何在这段代码中执行“df.applymap(try_literal_eval)”。比如指定我的列名 @NikitaGupta 例如df.A.apply(try_literal_eval)
以上是关于从csv读取到数据框pandas python时,dict对象转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何在streamlit中从用户读取csv文件并转换为pandas数据框
使用 pandas Python (pandas.io.parsers.TextFileReader) 从文件中读取数据时出现问题
当我将 pandas 数据框保存为 csv 文件时,从 18 位长的列中截断 3 位
如何使用 python pandas 在本地系统 Jupyter Notebook 中读取两个较大的 5GB csv 文件?如何在本地加入两个数据框进行数据分析?