2016-11-24 5 views
2

Ich habe folgende Datenstruktur:Flatten eine Eins-zu-Eins-Abbildung in einem Multiindex Pandas Datenrahmen

from collections import OrderedDict 
import pandas as pd 

d = OrderedDict([ 
    ((5, 3, 1), {'y1': 1}), 
    ((5, 3, 2), {'y2': 2}), 
    ((5, 4, 1), {'y1': 10}), 
    ((5, 4, 2), {'y2': 20}), 

    ((6, 3, 1), {'y1': 100}), 
    ((6, 3, 2), {'y2': 200}), 
    ((6, 4, 1), {'y1': 1000}), 
    ((6, 4, 2), {'y2': 2000}), 
]) 

df = pd.DataFrame(
    d.values(), 
    index=pd.MultiIndex.from_tuples(d.keys(), names=['x3', 'x2', 'x1']), 
) 

Die Tabelle sieht wie

  y1 y2 
x3 x2 x1    
5 3 1  1 NaN 
     2 NaN  2 
    4 1  10 NaN 
     2 NaN 20 
6 3 1 100 NaN 
     2 NaN 200 
    4 1 1000 NaN 
     2 NaN 2000 

Wie man dort sehen kann eine ein- ist zu-eins-Abbildung zwischen x1 und den Spalten (x1 = 1: y1, x1 = 2: y2), die ich in

  y1 y2 
x3 x2    
5 3  1  2 
    4  10 20 
6 3 100 200 
    4 1000 2000 

Wie abflachen will, kann ich es tun?

Edit: Oder umgekehrt:

   y 
x3 x2 x1    
5 3 1  1 
     2  2 
    4 1  10 
     2  20 
6 3 1 100 
     2 200 
    4 1 1000 
     2 2000 
+0

Was Sie bisher versucht haben? – Roman

Antwort

2

Sie stack für entfernen können NaN, weil Series erstellen, entfernen third Ebene von reset_index und Letzte Umformung von unstack:

print (df.stack().reset_index(level=2,drop=True).unstack(2)) 
      y1  y2 
x3 x2     
5 3  1.0  2.0 
    4  10.0 20.0 
6 3 100.0 200.0 
    4 1000.0 2000.0 

Wenn Notwendigkeit int insg astype:

print (df.stack().reset_index(level=2,drop=True).unstack(2).astype(int)) 
     y1 y2 
x3 x2    
5 3  1  2 
    4  10 20 
6 3 100 200 
    4 1000 2000 

EDIT:

print (df.stack().reset_index(level=3,drop=True).to_frame('y').astype(int)) 
      y 
x3 x2 x1  
5 3 1  1 
     2  2 
    4 1  10 
     2  20 
6 3 1 100 
     2 200 
    4 1 1000 
     2 2000 
+0

Das passt zu meinen Bedürfnissen, danke. Vielleicht weißt du auch einen Weg, es anders herum zu machen (siehe meine Bearbeitung). – fhgd

+0

Ich habe die Antwort selbst gefunden: 'df.stack(). Reset_index (level = 3, drop = True) .to_frame ('y')' – fhgd

+0

Entschuldigung, ich war offline. Siehe Bearbeiten. – jezrael

0
df2 = df.unstack() 
df2.columns = range(4) 
df3 = df2.drop([1,2], axis=1) 
df3.columns = ["Y1", "Y2"] 
df3 

gibt

enter image description here

Verwandte Themen