为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

桃花长相依 2023-10-11 22:51:16
import pandas as pdfrom random import randomfrom collections import namedtupleSmoker    = namedtuple("Smoker", ["Female","Male"])Nonsmoker = namedtuple("Nonsmoker", ["Female","Male"])DF = dict() DF["A"] = [(Smoker(random(),random()), Nonsmoker(random(),random())) for t in range(3)]DF["B"] = [(Smoker(random(),random()), Nonsmoker(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))
查看完整描述

2 回答

?
大话西游666

TA贡献1817条经验 获得超14个赞

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

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

TLDR,这是正常且预期的行为。如果您想使用 dtype 保存和加载数据object,您应该使用二进制格式,例如to_picklefrom_pickle方法。


查看完整回答
反对 回复 2023-10-11
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

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

前任:

import ast

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


查看完整回答
反对 回复 2023-10-11
  • 2 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信