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
是基于文本的,因此當您將object
dtype 保存到時csv
,自然的方法是使用字符串表示形式。于是就tuple((1,2))
變成了"(1,2)"
。
現在,當您讀回csv
文件時,自然且安全的解釋方式"(1,2)"
當然是字符串'(1,2)'
,因為 Pandas 沒有解析元組值列的引擎。
TLDR,這是正常且預期的行為。如果您想使用 dtype 保存和加載數據object
,您應該使用二進制格式,例如to_pickle
和from_pickle
方法。

胡說叔叔
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})
添加回答
舉報
0/150
提交
取消