johnbaltis - 1 year ago 259

Python Question

I have a

`pandas.DataFrame`

`MultiIndex`

`pandas.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)

Note that in this example I create what I

So, IRL I would start with

`df`

`df2`

`vals`

`result`

Recommended for you: Get network issues from **WhatsUp Gold**. **Not end users.**

Answer Source

You need `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
```

If need compare both `DataFrames`

, need replace `NaN`

to same values, else get `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
```

Recommended from our users: **Dynamic Network Monitoring from WhatsUp Gold from IPSwitch**. ** Free Download**