pandas,将DataFrame转换为MultiIndex数据框

11

我有一个 pandas.DataFrame,我想将它转换为一个具有 MultiIndexpandas.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 = pandas.concat((pandas.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)
请注意,这个例子中我创建了我想要的和我拥有的内容。
因此,在现实生活中,我将从df开始,并希望将其转换为df2(并且无法访问vals和result),我该如何做到这一点?
1个回答

15
你需要 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

我们可以对非数字值执行此操作吗?例如,在索引xy列的第一个值之后,所有常见值都有空格。 - Murtaza Haji
@MurtazaHaji - 你认为答案中的 x,y 下面的空字符串是干什么用的?这只是为了显示。 - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接