2016-11-09 189 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

相关问题