【问题标题】:pandas, convert DataFrame to MultiIndex'ed DataFramepandas,将 DataFrame 转换为 MultiIndex'ed DataFrame
【发布时间】:2017-03-23 07:04:43
【问题描述】:

我有一个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 = 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)

请注意,在此示例中,我创建了我想要和我拥有的内容。

所以,IRL 我会从df 开始,想把它变成df2(并且无法访问valsresult),我该怎么做?

【问题讨论】:

    标签: python pandas numpy multidimensional-array dataframe


    【解决方案1】:

    你需要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 列中的第一个值之后的所有常见值都有空格?
    • @MurtazaHaji - 你认为x,y 下的空字符串在回答吗?仅供展示
    猜你喜欢
    • 2017-03-17
    • 1970-01-01
    • 2017-04-13
    • 2021-03-29
    • 2017-04-27
    • 2017-01-28
    • 1970-01-01
    • 2015-08-08
    相关资源
    最近更新 更多