折叠熊猫 MultiIndex

Posted

技术标签:

【中文标题】折叠熊猫 MultiIndex【英文标题】:collapse a pandas MultiIndex 【发布时间】:2016-09-02 09:23:30 【问题描述】:

假设我有一个 DataFrameMultiIndex 列。如何将级别折叠为值的串联,以便我只有一个级别?

设置

np.random.seed([3, 14])
col = pd.MultiIndex.from_product([list('ABC'), list('DE'), list('FG')])
df = pd.DataFrame(np.random.rand(4, 12) * 10, columns=col).astype(int)

print df

   A           B           C         
   D     E     D     E     D     E   
   F  G  F  G  F  G  F  G  F  G  F  G
0  2  1  1  7  5  9  9  2  7  4  0  3
1  3  7  1  1  5  3  1  4  3  5  6  0
2  2  6  9  9  9  5  7  0  1  2  7  5
3  2  2  8  0  3  9  4  7  0  8  2  5

我希望结果如下所示:

   ADF  ADG  AEF  AEG  BDF  BDG  BEF  BEG  CDF  CDG  CEF  CEG
0    2    1    1    7    5    9    9    2    7    4    0    3
1    3    7    1    1    5    3    1    4    3    5    6    0
2    2    6    9    9    9    5    7    0    1    2    7    5
3    2    2    8    0    3    9    4    7    0    8    2    5

【问题讨论】:

【参考方案1】:

解决方案

我做了这个

def collapse_columns(df):
    df = df.copy()
    if isinstance(df.columns, pd.MultiIndex):
        df.columns = df.columns.to_series().apply(lambda x: "".join(x))
    return df

我必须检查它是否为MultiIndex,因为如果不是,我将拆分一个字符串并将其与我在join 中选择的任何分隔符重新组合。

【讨论】:

受到您的解决方案的启发,我想到了这个:df.columns.to_series().str.join('')【参考方案2】:

你可以试试这个:

In [200]: cols = pd.Series(df.columns.tolist()).apply(pd.Series).sum(axis=1)

In [201]: cols
Out[201]:
0     ADF
1     ADG
2     AEF
3     AEG
4     BDF
5     BDG
6     BEF
7     BEG
8     CDF
9     CDG
10    CEF
11    CEG
dtype: object

【讨论】:

【参考方案3】:
df.columns = df.columns.to_series().apply(''.join)

这不会产生分隔符,但您可以在 '_' 中替换 '' 或任何其他您可能想要的分隔符。

【讨论】:

以上是关于折叠熊猫 MultiIndex的主要内容,如果未能解决你的问题,请参考以下文章

对熊猫中相同行的列表理解[重复]

熊猫数据框使用列作为行[重复]

熊猫合并具有相同值和相同索引的行

将分组的聚合唯一列添加到熊猫数据框

Vim:仅折叠顶层折叠

vim技巧:折叠快捷键