微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

保存到csv并重新加载数据框pandas后,元组为什么会变成字符串?

如何解决保存到csv并重新加载数据框pandas后,元组为什么会变成字符串?

import pandas as pd
from random import random
from collections import namedtuple

Smoker    = namedtuple("Smoker",["Female","Male"])
Nonsmoker = namedtuple("Nonsmoker","Male"])

DF = dict() 
DF["A"] = [(Smoker(random(),random()),Nonsmoker(random(),random())) for t in range(3)]
DF["B"] = [(Smoker(random(),random())) for t in range(3)]
DF = pd.DataFrame(DF,index=["t="+str(t+1) for t in range(3)])

我有这个数据框,其每个单元格都是两个命名元组元组。将其保存到csv文件并重新加载后,打印出的内容看起来相同,但是每个单元格都变成了 string 。它怎么发生的?每次获取相同的数据框该怎么办?

DF.to_csv("results.csv",index_label=False)
df = pd.read_csv('results.csv',index_col=0)

print(df)

for a,b in zip(df.A,df.B):
    print(type(a),type(b))

解决方法

我相信这是预期的行为。由于csv是基于文本的,因此将object dtype保存到csv时,自然的方法是使用字符串表示形式。因此tuple((1,2))变成"(1,2)"

现在,当您读回csv文件时,解释"(1,2)"的自然而安全的方法当然是字符串'(1,2)',因为Pandas没有解析元组的引擎,有价值的列。

TLDR ,这是正常现象和预期行为。如果要使用object dtype保存和加载数据,则应使用二进制格式,例如to_picklefrom_pickle方法。

,

在读取csv时获取元组的一种方法是使用converters

例如:

import ast

df = pd.read_csv('results.csv',index_col=0,converters={"A": ast.literal_eval,"B": ast.literal_eval})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?