删除panda中封装字典类型的字符串引号的最快方法



我有一些pd.DataFrame;其元素最初为CCD_ 2型。但是,我把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, 'priceHint': {'raw': 2, 'fmt': '2', 'longFmt': '2'}}

我的pd.DataFrame相当大(>30000个元素(。实现这一目标的最快方法是什么?很可能没有运行任何循环。我想,pd.read_csv级别的一些选项组合可以做到这一点,但我还不知道如何做到。

编辑1.0

这是一个允许复制输入的pd.DataFrame

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, 'priceHint': {'raw': 3, 'fmt': '3', 'longFmt': '3'}}",
"{'maxAge': 1, 'priceHint': {'raw': 2, 'fmt': '2', '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, 'priceHint': {'raw': 3, 'fmt': '3', 'longFmt': '3'}}",
"{'maxAge': 1, 'priceHint': {'raw': 2, 'fmt': '2', 'longFmt': '2'}}"]})
df.iloc[0, 0] # Each element of this Series is a string
# "{'maxAge': 1, 'priceHint': {'raw': 2, 'fmt': '2', 'longFmt': '2'}}"

ast.literal_eval与系列一起使用。应用

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, 'priceHint': {'raw': 2, 'fmt': '2', 'longFmt': '2'}}

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

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

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

最新更新