在pandas中将可变长度列表保存到HDF5

时间:2016-04-13 13:12:40

标签: python pandas large-files large-data

我对熊猫很新,所以如果我的问题很简单,请道歉。

我想将pandas数据框保存到hdf5,其中包含可变长度列表列表。我的目标是稍后在chuncks中写入和读取此数据框。这似乎只有在我以表格格式存储数据帧时才有可能。 但是,如果我以表格格式保存数据框,则会出现以下错误:

TypeError: Cannot serialize the column [pdf] because its data contents are [mixed] object dtype

在下文中,我展示了一个重现问题的最小示例:

import pandas as pd
import numpy as np
df = pd.DataFrame()
df['ID'] = [el for el in np.arange(100)]
df['pdf'] = [np.arange(i) for i in df['ID']]
df.to_hdf('test_format_table.h5','df', format='table')

如果我使用format =' fixed'保存数据框。一切都会工作,但我想以表格格式保存。

是否可以轻松解决此问题?

非常感谢您的协助。

马库斯

1 个答案:

答案 0 :(得分:0)

你正在以一种奇怪的方式解决这个问题。当您拥有整洁的数据时,Pandas和HDF5可以很好地工作。

In [32]: df
Out[32]: 
   ID                          pdf
0   0                           []
1   1                          [0]
2   2                       [0, 1]
3   3                    [0, 1, 2]
4   4                 [0, 1, 2, 3]
5   5              [0, 1, 2, 3, 4]
6   6           [0, 1, 2, 3, 4, 5]
7   7        [0, 1, 2, 3, 4, 5, 6]
8   8     [0, 1, 2, 3, 4, 5, 6, 7]
9   9  [0, 1, 2, 3, 4, 5, 6, 7, 8]

将列表分解为列

In [33]: df2 = pd.concat([df.ID, df.pdf.apply(Series)], axis=1)

In [34]: df2
Out[34]: 
   ID    0    1    2    3    4    5    6    7    8
0   0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
1   1  0.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
2   2  0.0  1.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN
3   3  0.0  1.0  2.0  NaN  NaN  NaN  NaN  NaN  NaN
4   4  0.0  1.0  2.0  3.0  NaN  NaN  NaN  NaN  NaN
5   5  0.0  1.0  2.0  3.0  4.0  NaN  NaN  NaN  NaN
6   6  0.0  1.0  2.0  3.0  4.0  5.0  NaN  NaN  NaN
7   7  0.0  1.0  2.0  3.0  4.0  5.0  6.0  NaN  NaN
8   8  0.0  1.0  2.0  3.0  4.0  5.0  6.0  7.0  NaN
9   9  0.0  1.0  2.0  3.0  4.0  5.0  6.0  7.0  8.0

重命名以使名称清晰

In [35]: df2.columns = ['ID'] + [ 'C%s' % c for c in df2.columns[1:] ]

In [36]: df2
Out[36]: 
   ID   C0   C1   C2   C3   C4   C5   C6   C7   C8
0   0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
1   1  0.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
2   2  0.0  1.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN
3   3  0.0  1.0  2.0  NaN  NaN  NaN  NaN  NaN  NaN
4   4  0.0  1.0  2.0  3.0  NaN  NaN  NaN  NaN  NaN
5   5  0.0  1.0  2.0  3.0  4.0  NaN  NaN  NaN  NaN
6   6  0.0  1.0  2.0  3.0  4.0  5.0  NaN  NaN  NaN
7   7  0.0  1.0  2.0  3.0  4.0  5.0  6.0  NaN  NaN
8   8  0.0  1.0  2.0  3.0  4.0  5.0  6.0  7.0  NaN
9   9  0.0  1.0  2.0  3.0  4.0  5.0  6.0  7.0  8.0

将列设为行

In [47]: df2.stack().reset_index()
Out[47]: 
    level_0 level_1    0
0         0      ID  0.0
1         1      ID  1.0
2         1      C0  0.0
3         2      ID  2.0
4         2      C0  0.0
..      ...     ...  ...
50        9      C4  4.0
51        9      C5  5.0
52        9      C6  6.0
53        9      C7  7.0
54        9      C8  8.0

[55 rows x 3 columns]

In [48]: df2 = df2.stack().reset_index()

重命名

In [49]: df2.columns = ['A', 'B', 'C']

In [50]: df2
Out[50]: 
    A   B    C
0   0  ID  0.0
1   1  ID  1.0
2   1  C0  0.0
3   2  ID  2.0
4   2  C0  0.0
.. ..  ..  ...
50  9  C4  4.0
51  9  C5  5.0
52  9  C6  6.0
53  9  C7  7.0
54  9  C8  8.0

[55 rows x 3 columns]

这是整洁的数据,IOW它的标准化和有用的工作。

In [51]: df2.to_hdf('test.h5','df',format='table')