joh*_*tis 6 python numpy multidimensional-array dataframe pandas
我有一个pandas.DataFrame要转换为MultiIndexed的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)
Run Code Online (Sandbox Code Playgroud)
请注意,在此示例中,我创建了我想要的东西和我拥有的东西。
因此,我会从IRL开始df并希望将其变成df2(并且没有访问valsand的权限result),我该怎么做?
您需要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
Run Code Online (Sandbox Code Playgroud)
如果需要比较两者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
Run Code Online (Sandbox Code Playgroud)