2016-11-09 17 views
2

pandas.DataFrame私はMultiIndex ed 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

関連する問題