我有一些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})
这不应该提高性能,但可以稍微简化代码。