2016-11-09 191 views
2

我有一個pandas.DataFrame,我想將其轉換爲MultiIndex ed pandas.DataFramepandas,將DataFrame轉換爲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) 

注意,在這個例子中,我創建了我和我

所以,IRL我將開始與df,並希望把它變成df2(而不必訪問valsresult),我該怎麼辦呢?

回答

3

您需要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 

如果需要比較這兩個DataFrames,需要更換NaN到相同的值,否則得到False

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

美麗的,謝謝! – johnbaltis

相關問題