2016-04-13 17 views
1

Pandalar için oldukça yeni, sorularım önemsiz ise lütfen özür dileriz.Değişken uzunluktaki listeleri pandalarda HDF5'e kaydetme

Bir pandalar veri çerçevesini, sütun olarak değişken uzunluklu listelerin bir listesini içeren hdf5'e kaydetmek istiyorum. Amacım bu veri çerçevesine daha sonra parçalara yazmak ve okumaktır. Bu sadece veri çerçevesini tablo formatında sakladığımda mümkün görünüyor. ben tablo formatında verilerim çerçeveyi kaydetmek Ancak eğer aşağıdaki hatayı alıyorum: Veri çerçevesi kaydederseniz

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') 

: Ben sorunu yeniden oluşturmak için minimal bir örneğini göstermektedir aşağıdaki yılında

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

format = 'fixed' ile her şey çalışacaktır, ancak tablo formatında kaydetmek istiyorum.

Bu sorunu kolayca gidermek mümkün mü?

Yardımlarınız için çok teşekkür ederim.

Markus

cevap

0

Sen garip bir şekilde bu sorunu yaklaşıyor. Pandalar ve HDF5 düzenli verileriniz olduğunda iyi çalışır.

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() 

adlandırmak
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 [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 

satırlara sütunları olun net isimler yapmak

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 

adlandırma sütunlara listesini patlayabilir

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] 

Bu, düzenli verileri, normalize edilmiş ve üzerinde çalıştığı için faydalıdır.

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

Cevabınız için çok teşekkür ederim. Tamamen haklısınız: Bu sorunu tek bir şekilde çözüyorum. Bunu yapmamın sebebi depolama alanıdır, bu yüzden herhangi bir dolgu yapmamamın nedeni budur. Çözümü denedim ve 1.46 Gb boyutunda bir dosya üretirken, benim "çözümüm" sadece 401,5 MB gerektiriyor. Bu örnek için kullanıyorum df ['ID'] = [el için np.arange (10000)]. Bu, benim dosyam için bir dosya çok büyük olduğundan, gerçekten dolgudan kaçınmak istiyorum. Bunun nasıl yapılabileceği hakkında bir fikrin var mı? – Markus