使用列表作为值来保存和加载pandas数据帧时不一致

时间:2013-09-24 13:10:44

标签: python pandas

我有一个pandas数据框,其中一列有列表作为值。例如:

a = [(1,1,[1,2]),(2,2,[2,3,4])]
In [75]: pd.DataFrame.from_records(a,columns=['a','b','c'],exclude='b')
Out[75]:
   a          c
0  1     [1, 2]
1  2  [2, 3, 4]

如您所见,列c实际上包含一个列表。这可以通过以下方式得到证实:

In [76]: _.c.ix[0]
Out[76]: [1, 2]

所以在这里,数据框包含真实的列表,可供以后分析所有列表类功能。 但是当我保存数据帧然后再次加载它时,列表变为字符串:

In [72]: _.to_csv(r'D:\test.csv')

In [73]: pd.read_csv(r'D:\test.csv')
Out[73]:
   Unnamed: 0  a          c
0           0  1     [1, 2]
1           1  2  [2, 3, 4]

In [74]: _.c.ix[0]
Out[74]: '[1, 2]'

我丢失了列表功能。这是一个错误吗?

1 个答案:

答案 0 :(得分:2)

不,这不是一个错误。 CSV文件没有数据类型信息。加载文件时,所有read_csv必须继续是文本。当它在文件中看到[1, 2]时,它不会假定它应该将内容作为列表处理。 (这是正确的; CSV文件可能包含该格式的文本,是列表。)

直接回答:如果要将列重新转换为列表,请执行df['c'] = df['c'].map(ast.literal_eval)。 (当然,您必须先import ast。)您可以将其写入“转换器”函数,以便在加载时执行此操作 - 请参阅read_csv文档。

更好的方法:将您的数据保存为CSV以外的其他内容,以便在加载时保存和恢复数据类型。最简单的方法是保存为二进制文件:df.to_pickle('test.df')

大图片:DataFrames或包含系列的列表是单一的:它们处理起来不是很方便,并且它们不能提供大多数pandas处理数据的好工具。再想一想您是否真的需要将数据作为列表。 (也许你这样做,但它应该是最后的手段。)