2016-11-09 6 views
2

ed pandas.DataFrame으로 변환하려는 pandas.DataFrame가 있습니다.pandas, 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을 비교하면, False을 얻을 다른, 같은 값에 NaN을 교체해야합니다

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

관련 문제