从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 数据框列

使用 pandas Python (pandas.io.parsers.TextFileReader) 从文件中读取数据时出现问题

在 pandas/python 中,读取存储为字符串的数组

当我将 pandas 数据框保存为 csv 文件时,从 18 位长的列中截断 3 位

如何使用 python pandas 在本地系统 Jupyter Notebook 中读取两个较大的 5GB csv 文件?如何在本地加入两个数据框进行数据分析?