将包含长列表的Pandas数据框保存为CSV文件。

9

我正在尝试将pandas数据框保存为csv文件。当前我的代码看起来像这样:

with open('File.csv', 'a') as f:
        df.to_csv(f, header=False)

保存操作是成功的,但问题在于数据框中的列表被压缩成了 [first, second,...,last] 的形式,其中所有中间的元素都被忽略了。如果我只查看原始数据框,所有条目都在那里。有没有办法可以将列表转换为包含所有元素的字符串(str(df)也会丢弃中间的元素),或者如何在 csv 表格的单元格中保存完整的 numpy 数组?谢谢您的帮助,Viviane。

2
我看不出来你的代码为什么不起作用。我注意到你是在将数据追加到文件中,而不是创建一个新文件。你确定文件中没有已经存在的数据吗?如果你查看文件末尾,是否有整个数据框架? - Ryan
是的,为了我的目的,我需要追加,不好意思,它还没有在末尾。 - thebear
不,df.to_csv('File.csv', header=False, mode='a') 应该将__所有__的值写入文件。你能提供一个__可重现的__代码吗? - MaxU - stand with Ukraine
df = pd.DataFrame(columns=['ID','A']) hot = np.zeros(9999) ID = 1 df=df.append({'ID': int(ID),'A':hot}, ignore_index=True) with open('test.csv', 'a') as f: df.to_csv(f, header=False) - thebear
4个回答

6

我在保存数据帧时也遇到了问题。 我有一个数据帧,其中一些列由列表作为其元素组成。 当我使用df.to_csv保存数据帧,然后使用df.read_csv从磁盘读取时,列表和数组被转换为一串字符。 因此,[1,2,3]被转换为'[1,2,3]'。 当我使用HDF5格式时,问题得到解决。

如果你的数据帧名为df_temp,那么你可以使用:

store = pd.HDFStore('store.h5')
store['df'] = df_temp

用HDF5格式保存数据框,您可以使用以下命令进行读取:

store = pd.HDFStore('store.h5')
df_temp_read = store['df']

您可以查看这个答案。我还应该提到,对我来说pickle并没有起到作用,因为当从文件中读取时,我丢失了列名。也许我做错了什么,但除此之外,如果您计划在不同的Python版本中读取文件,pickle可能会导致兼容性问题。


这可能是最佳答案。适用于包含多个数据类型的多个列表的数据框。 - ClonedOne

3

您的代码应该正常工作。我无法复现所描述的行为。

以下是更加“熊猫式”的版本:

df.to_csv('File.csv', header=False, mode='a')

请注意mode='a'(附加)参数...。
更新:
如何在显示/打印DF时去掉省略号:请查看此处
with pd.option_context("display.max_columns", 0):
    print(df)

1
我同意这个也应该可行,但我看不出原始代码为什么不起作用。它们应该是等效的。DataFrame.to_csv可以接受文件名或文件缓冲区。 - Ryan
@Viviane,请在文本或十六进制编辑器中检查它 - 例如在Notepad ++中。 - MaxU - stand with Ukraine
我不知道是否忽略了什么,但我使用了这段代码:df = pd.DataFrame(columns=['ID','A']) hot = np.zeros(9999) ID = 1 df=df.append({'ID': int(ID),'A':hot}, ignore_index=True) with open('test.csv', 'a') as f: df.to_csv(f, header=False,mode='a') test = pd.read_csv('test.csv',names=['ID','A']).set_index('ID') with pd.option_context("display.max_columns", 0): print(test['A'])输出结果为:ID 1 [ 0. 0. 0. ..., 0. 0. 0.] - thebear
似乎很明显问题不在于文件本身,而是在于@Viviane检查文件的方式。 - Ryan
是的,我同意Max的观点,我没有找到任何方法可以打开它并查看列表中的所有内容。但是,当像Max建议的那样创建df时,它会保存所有内容。不过我不确定在我的情况下是否可以使用这种创建Df的方式。 - thebear
显示剩余7条评论

1
您可以使用join方法将列表中的元素转换。
例如:
lst =  ['Hello!','I','am', 'Pandas User','.']
strng = ' '.join(lst)
print (strng)

希望这对你有所帮助。


谢谢,可以用了 :) 如果pandas有一种方法可以在不使用这个技巧的情况下将所有内容保存到csv文件中,那就太好了,但这是一个很好的解决方法。 - thebear
我很高兴这个解决方法对你有用。我很想了解为什么你的原始代码没有起作用。希望还会有人发布一个解释! - Ryan

0
我认为pandas中的pd.to_hdf()pd.read_hdf()函数可以简单地实现保存和加载hdf5文件的要求,而无需安装tables包。

1
目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接