保存到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})

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...