2016-11-09 12 views
2

Ich habe eine pandas.DataFrame, die ich in eine MultiIndex ed pandas.DataFrame konvertieren möchte.Pandas, konvertieren DataFrame zu MultiIndex'ed DataFrame

import numpy 
import pandas 
import itertools 

xs = numpy.linspace(0, 10, 100) 
ys = numpy.linspace(0, 0.1, 20) 
zs = numpy.linspace(0, 5, 200) 

def func(x, y, z): 
    return x * y/z 

vals = list(itertools.product(xs, ys, zs)) 
result = [func(x, y, z) for x, y, z in vals] 

# Original DataFrame. 
df = pandas.DataFrame(vals, columns=['x', 'y', 'z']) 
df = pd.concat((pd.DataFrame(result, columns=['result']), df), axis=1) 

# I want to turn `df` into this `df2`. 
index = pandas.MultiIndex.from_tuples(vals, names=['x', 'y', 'z']) 
df2 = pandas.DataFrame(result, columns=['result'], index=index) 

Beachten Sie, dass in diesem Beispiel erstelle ich, was ich will und was ich haben.

So, IRL Ich würde mit df beginnen und es in df2 machen wollen (und haben keinen Zugang zu vals und result), wie mache ich das?

Antwort

3

Sie benötigen set_index:

print (df2.head()) 
        result 
x y z    
0.0 0.0 0.000000  NaN 
     0.025126  0.0 
     0.050251  0.0 
     0.075377  0.0 
     0.100503  0.0 

print (df.set_index(['x','y','z']).head()) 

        result 
x y z    
0.0 0.0 0.000000  NaN 
     0.025126  0.0 
     0.050251  0.0 
     0.075377  0.0 
     0.100503  0.0 

Wenn die Notwendigkeit, sowohl DataFrames vergleichen, ersetzen müssen NaN zu gleichen Werte, sonst False erhalten:

print (df.set_index(['x','y','z']).eq(df2).all()) 
result False 
dtype: bool 

print (np.nan == np.nan) 
False 

print (df.fillna(1).set_index(['x','y','z']).eq(df2.fillna(1)).all()) 
result True 
dtype: bool 
+0

Schöne, danke! – johnbaltis