展平 3 级 MultiIndex Pandas 数据框

Posted

技术标签:

【中文标题】展平 3 级 MultiIndex Pandas 数据框【英文标题】:Flatten 3 level MultiIndex Pandas dataframe 【发布时间】:2018-02-20 03:10:08 【问题描述】:

我有以下熊猫df:

Window         5                                                           15                                                          30                                                          45                                                  
feature      col0                col1                col2                col0                col1                col2                col0                col1                col2                col0                col1                col2          
metric       mean       std      mean       std      mean       std      mean       std      mean       std      mean       std      mean       std      mean       std      mean       std      mean       std      mean       std      mean       std
0             NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN
1             NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN
2             NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN
3             NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN
4       -0.878791  1.453479 -0.265591  0.712361  0.532332  0.894304       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN
5       -0.748535  1.459479 -0.023874  1.250110  0.913094  1.134599       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN       NaN

它有 3 个级别,我想将其展平为:

col0_5_mean  col0_5_std  col0_15_mean  col0_15_std  col0_30_mean  col0_30_std  col0_45_mean col0_45_std  col1_5_mean  col1_5_std...

所以 order 应该是 feature_window_metric。

df 由以下方式生成:

import numpy as np
import pandas as pd
np.random.seed(123)


# def add_mean_std_cols3(df):
df = pd.DataFrame(np.random.randn(100,3)).add_prefix('col')

windows = [5, 15, 30, 45]
stats = ['mean', 'std']
cols = pd.MultiIndex.from_product([windows, df.columns, stats], 
                                  names=['window', 'feature', 'metric'])

df2 = pd.DataFrame(np.empty((df.shape[0], len(cols))), columns=cols,
                   index=df.index)

for window in windows:
    df2.loc[:, window] = df.rolling(window=window).agg(stats).values

print df2

到目前为止,我尝试了以下解决方案:

来自Pandas dataframe with multiindex column - merge levels

df2.columns = df2.columns.map('|'.join)

TypeError: sequence item 0: expected string, long found

感谢您的建议,

谢谢

【问题讨论】:

【参考方案1】:

使用

In [1914]: df2.columns = ['1_0_2'.format(*c) for c in df2.columns]

In [1915]: df2.columns
Out[1915]:
Index([u'col0_5_mean', u'col0_5_std', u'col1_5_mean', u'col1_5_std',
       u'col2_5_mean', u'col2_5_std', u'col0_15_mean', u'col0_15_std',
       u'col1_15_mean', u'col1_15_std', u'col2_15_mean', u'col2_15_std',
       u'col0_30_mean', u'col0_30_std', u'col1_30_mean', u'col1_30_std',
       u'col2_30_mean', u'col2_30_std', u'col0_45_mean', u'col0_45_std',
       u'col1_45_mean', u'col1_45_std', u'col2_45_mean', u'col2_45_std'],
      dtype='object')

In [1916]: df2.head(2)
Out[1916]:
   col0_5_mean  col0_5_std  col1_5_mean  col1_5_std  col2_5_mean  col2_5_std  \
0          NaN         NaN          NaN         NaN          NaN         NaN
1          NaN         NaN          NaN         NaN          NaN         NaN

   col0_15_mean  col0_15_std  col1_15_mean  col1_15_std     ...       \
0           NaN          NaN           NaN          NaN     ...
1           NaN          NaN           NaN          NaN     ...

   col1_30_mean  col1_30_std  col2_30_mean  col2_30_std  col0_45_mean  \
0           NaN          NaN           NaN          NaN           NaN
1           NaN          NaN           NaN          NaN           NaN

   col0_45_std  col1_45_mean  col1_45_std  col2_45_mean  col2_45_std
0          NaN           NaN          NaN           NaN          NaN
1          NaN           NaN          NaN           NaN          NaN

[2 rows x 24 columns]

【讨论】:

太棒了!非常感谢!你知道我在哪里可以了解更多关于这种格式的信息吗?【参考方案2】:

您仍然可以将mapformat 一起使用:

df2.columns = df2.columns.map('0[0] | 0[1] | 0[2]'.format)

【讨论】:

@Diego Index(['5 | col0 | mean', '5 | col0 | std', '5 | col1 | mean', '5 | col1 | std', '5 | col2 |均值'、'5 | col2 | std'、'15 | col0 | mean'、'15 | col0 | std'、'15 | col1 | mean'、'15 | col1 | std'、'15 | col2 | mean' , '15 | col2 | std', '30 | col0 | mean', '30 | col0 | std', '30 | col1 | mean', '30 | col1 | std', '30 | col2 | mean', ' 30 | col2 | std', '45 | col0 | mean', '45 | col0 | std', '45 | col1 | mean', '45 | col1 | std', '45 | col2 | mean', '45 | col2 | std'], dtype='object')

以上是关于展平 3 级 MultiIndex Pandas 数据框的主要内容,如果未能解决你的问题,请参考以下文章

Pandas Dataframe Multiindex 按级别和列值排序

Pandas Multiindex 系列级别重新索引

pandas 与 MultiIndex 合并,当只有一级索引用作键时

如何用另一个的 MultiIndex 分割一个 MultiIndex DataFrame

将多个键上的 pandas 数据帧映射为列或 multiIndex

python 3 pandas和seaborn使用swarmplot进行斗争-multiIndex