如何解决保存到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_pickle
和from_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 举报,一经查实,本站将立刻删除。