首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何将“词典”一栏读入熊猫

如何将“词典”一栏读入熊猫
EN

Stack Overflow用户
提问于 2017-06-08 22:46:12
回答 3查看 5.6K关注 0票数 4

我有一个csv文件,它的类型是字典(下面示例中的列'b‘)。但是,b in df是一个字符串类型,即使我将它定义为字典类型。我没有找到这个问题的解决办法。有什么建议吗?

代码语言:javascript
代码运行次数:0
运行
复制
a = pd.DataFrame({'a': [1,2,3], 'b':[{'a':3, 'haha':4}, {'c':3}, {'d':4}]})
a.to_csv('tmp.csv', index=None)
df = pd.read_csv('tmp.csv', dtype={'b':dict})
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-08 23:02:16

我想知道CSV列是否实际上是Python列,或者更确切地说是JSON。如果是JSON,则可以将该列读入dtype=str,然后在该列上使用json_normalize()将其分解为多个列。假设列包含有效的JSON,这是一个有效的解决方案。

票数 3
EN

Stack Overflow用户

发布于 2017-06-08 22:59:18

熊猫没有字典类型。因此,您应该指定object,以防需要普通Python对象:

代码语言:javascript
代码运行次数:0
运行
复制
df = pd.read_csv('tmp.csv', dtype={'b':object})

这将包含字符串,因为熊猫不知道什么字典。如果您再次需要字典,您可以尝试使用ast.literal_eval (安全字符串计算)来“验证”它们:

代码语言:javascript
代码运行次数:0
运行
复制
df['b'] = df['b'].apply(ast.literal_eval)

print(df['b'][0]['a'])  # 3

如果您真的确信您从未在不受信任的csvs上运行此操作,那么您也可以使用eval。但在您考虑之前,我建议您尝试只对“本地”熊猫或DataFrame类型使用NumPy (也可能是DataFrame in DataFrame方法)。最好尽量避免object类型。

票数 2
EN

Stack Overflow用户

发布于 2022-01-19 07:33:27

您可以使用转换器参数。从文件中:

转换器: dict,可选 用于转换某些列中的值的函数的Dict。键可以是整数,也可以是列标签。

如果您知道您的列格式良好且不包含缺少的值,那么您可以这样做:

代码语言:javascript
代码运行次数:0
运行
复制
df = pd.read_csv('tmp.csv', converters = {'b': ast.literal_eval})

但是,为了安全(正如其他人所评论的那样),您可能应该使用一些基本的错误恢复能力来定义自己的函数:

代码语言:javascript
代码运行次数:0
运行
复制
def to_dict(x):
    try:
        y = ast.literal_eval(x)
        if type(y) == dict:
            return y
    except:
        return None

然后:

代码语言:javascript
代码运行次数:0
运行
复制
df = pd.read_csv('tmp.csv', converters = {'b': to_dict})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44446709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档