我有一个带有多索引列的数据框:
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 级),而且它并不优雅。必须有一种更好的方法来一步完成这一任务。