通过向 MultiIndex 添加级别来将 DataFrame 嵌套在 MultiIndex DataFrame 中

问题描述 投票:0回答:1

我有一个带有多索引列的数据框:

import pandas as pd
import numpy as np
df = pd.DataFrame(columns=pd.MultiIndex.from_arrays([[100,100],[10,20],[1,3]]),
                 data=np.random.random(12).reshape(6,2))
df

现在我有一个函数可以为原始 DataFrame 的每一列计算一个新的 DataFrame:

def get_df(col):
    return pd.DataFrame({'Double':df[col]*2,'Triple':df[col]*3})

我想要的是创建一个新的DataFrame

dg
,通过在原始DataFrame的每一列插入计算的DataFrame,根据需要扩展列数,并添加一个来替换
df
的列中的原始数据MultiIndex 列的新级别。

我可以轻松地使用我需要的列创建一个新的 DataFrame

dg
,然后将它们填充到循环中:

dg = pd.DataFrame(columns=pd.MultiIndex.from_product([list(df.columns), ['Double','Triple']]))
for col in df.columns:
    dg[(col,'Double')] = get_df(col)['Double']
    dg[(col,'Triple')] = get_df(col)['Triple']
dg

这是结果:

这并不完全是我想要的,因为 MultiIndex 已经折叠到只有两级(而不是 4 级),而且它并不优雅。必须有一种更好的方法来一步完成这一任务。

pandas dataframe multi-index
1个回答
0
投票

如果严格在列上运行函数并返回数据帧的要求不是必需的,那么我们可以执行以下操作:

def Double(x): return x*2
def Triple(x): return x*3

df = df.apply([Double, Triple])

我定义了

Double
Triple
,以便 Pandas 可以在新的输出级别中使用它们的名称:

© www.soinside.com 2019 - 2024. All rights reserved.