问题描述
我有一些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})
这不会提高性能,但是可以稍微简化代码。