你正在以一种奇怪的方式解决这个问题。当您拥有整洁的数据时,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')