删除封装了熊猫字典类型的引号的最快方法

问题描述

我有一些pd.DataFrame;其元素最初是dict类型的。但是,我写了pd.DataFrame来键入csv。我现在遇到的问题是将文件读回到pd.DataFrame认情况下将字典读为string类型。例如,这是输出,我继续阅读csv文件

df.iloc[0,0]
"{'maxAge': 1,'priceHint': {'raw': 2,'fmt': '2','longFmt': '2'}}"

我想要的输出删除封装字典的字符串引号"",所以它应该像

所需的输出

df.iloc[0,0]
{'maxAge': 1,'longFmt': '2'}}

我的pd.DataFrame很大(> 30,000个元素)。实现这一目标的最快方法是什么?最有可能没有运行任何循环。我猜想,pd.read_csv级别的某些选项组合可以达到目的,但是我还无法弄清楚它是怎么做到的。

编辑1.0

这是pd.DataFrame,允许复制输入

df = pd.DataFrame({'col_a':["{'maxAge': 1,'longFmt': '2'}}",\
                   "{'maxAge': 2,'priceHint': {'raw': 3,'fmt': '3','longFmt': '3'}}",\
                  "{'maxAge': 2,\
                  "{'maxAge': 1,'longFmt': '2'}}"]})

解决方法

由于字典是字典的字符串表示形式,因此您需要使用eval方法来使其实际上再次像字典一样(仅尝试删除引号不会做任何事情)。最简单的方法是使用ast.literal_eval,这是直接调用python的eval方法的一种更安全的选择。

df = pd.DataFrame({'col_a':["{'maxAge': 1,'priceHint': {'raw': 2,'fmt': '2','longFmt': '2'}}",\
                   "{'maxAge': 2,'priceHint': {'raw': 3,'fmt': '3','longFmt': '3'}}",\
                  "{'maxAge': 2,\
                  "{'maxAge': 1,'longFmt': '2'}}"]})

df.iloc[0,0] # Each element of this Series is a string
# "{'maxAge': 1,'longFmt': '2'}}"

ast.literal_eval与Series.apply配合使用

import ast

df["col_a"] = df["col_a"].apply(ast.literal_eval)

df.iloc[0,0] # Each element of this Series is a dictionary
# {'maxAge': 1,'longFmt': '2'}}

或者,由于您是从csv读取的,因此可以在通过pd.read_csv读取数据时应用ast.literal_eval:

df = pd.read_csv("path/to/file.csv",converters={"col_a": ast.literal_eval})

这不会提高性能,但是可以稍微简化代码。