2017-10-19 19 views
0

je les suivantes pandas dataframeConversion pandas géants dataframe à des tableaux structurés

import pandas as pd 
a = [2.5,3.3] 
b = [3.6,3.9] 
D = {'A': a, 'B': b} 

qui me donne quelque chose comme

+---+-----+-----+ 
| | A | B | 
+---+-----+-----+ 
| 0 | 2.5 | 3.3 | 
| 1 | 3.6 | 3.9 | 
+---+-----+-----+ 

Je veux convertir cette trame de données à un tableau structuré comme

data = np.rec.array([ 
('A', 2.5), 
('A', 3.6), 
('B', 3.3), 
('B', 3.9), 
], dtype = [('Type','|U5'),('Value', '<i8')]) 

J'ai échoué à trouver un moyen d'y arriver puisque je suis nouveau pour les pandas. J'ai essayé pd.to_records mais l'index devient gênant et je n'arrive pas à le contourner.

Toute aide est appréciée. Merci.

Répondre

4

Melt the DataFrame pour faire A et B (l'index de colonne) dans une colonne. Pour se débarrasser de l'index numérique, faites de cette nouvelle colonne l'index. Alors appelez to_records():

import pandas as pd 
a = [2.5,3.3] 
b = [3.6,3.9] 
D = {'A': a, 'B': b} 
df = pd.DataFrame(D) 
result = (pd.melt(df, var_name='Type', value_name='Value') 
      .set_index('Type').to_records()) 
print(repr(result)) 

cède

rec.array([('A', 2.5), ('A', 3.3), ('B', 3.6), ('B', 3.9)], 
      dtype=[('Type', 'O'), ('Value', '<f8')]) 

Ceci est l'étape clé:

In [167]: df 
Out[167]: 
    A B 
0 2.5 3.6 
1 3.3 3.9 

In [168]: pd.melt(df) 
Out[168]: 
    variable value 
0  A 2.5 
1  A 3.3 
2  B 3.6 
3  B 3.9 

Une fois que vous avez fait fondre la trame de données, to_records (essentiellement) retourne désiré résultat:

In [169]: pd.melt(df).to_records() 
Out[169]: 
rec.array([(0, 'A', 2.5), (1, 'A', 3.3), (2, 'B', 3.6), (3, 'B', 3.9)], 
      dtype=[('index', '<i8'), ('variable', 'O'), ('value', '<f8')]) 
+0

travaillé comme un charme. Merci beaucoup @unutbu! –

1
np.rec.fromrecords(list(zip(df.melt().variable,df.melt().value))) 
Out[531]: 
rec.array([('A', 2.5), ('A', 3.3), ('B', 3.6), ('B', 3.9)], 
      dtype=[('f0', '<U1'), ('f1', '<f8')]) 
0

Vous pouvez fondre et appeler to_records:

pd.melt(df).to_records(index=False)