将一些 DataFrame 列重新索引为多索引

Posted

技术标签:

【中文标题】将一些 DataFrame 列重新索引为多索引【英文标题】:reindex some DataFrame columns to multi index 【发布时间】:2017-02-01 11:23:06 【问题描述】:

在我的工作流程中的某个时刻,我最终得到了一个带有一些列和一些行的常规 pandas DataFrame。我想使用df.to_latex() 将此 DataFrame 导出到乳胶表中。这很好用,但是,我知道要使用多列,其中某些列是多表的一部分。例如,一个包含 a、b、c、d、e 列的 DataFrame 我想保留 a 列,但将 b 和 c 以及 d 和 e 分组。

import numpy as np
import pandas as pd

# where I am
data = np.arange(15).reshape(3, 5)
df = pd.DataFrame(data=data, columns=['a', 'b', 'c', 'd', 'e'])

看起来像这样:

In [161]: df
Out[161]: 
    a   b   c   d   e
0   0   1   2   3   4
1   5   6   7   8   9
2  10  11  12  13  14

我想对 b 和 c 列以及 d 和 e 列进行分组,但不考虑 a。所以我想要的输出应该是这样的。

# where I want to be: leave column 'a' alone, group b&c as well as d&e
multi_index = pd.MultiIndex.from_tuples([
    ('a', ''),
    ('bc', 'b'),
    ('bc', 'c'),
    ('de', 'd'),
    ('de', 'e'),
])
desired = pd.DataFrame(data, columns=multi_index)

看起来像这样:

In [162]: desired
Out[162]: 
    a  bc      de    
        b   c   d   e
0   0   1   2   3   4
1   5   6   7   8   9
2  10  11  12  13  14

为了到达那里,我尝试了一个简单的重新索引。这给了我想要的形状,但所有列都只得到 NaN 作为值。

# how can use df and my multiindexreindex to multi column DataFrame
result = df.reindex(columns=multi_index)

结果看起来像描述的那样,正确的索引,但都是 NaN

In [166]: result
Out[166]: 
    a  bc      de    
        b   c   e   e
0 NaN NaN NaN NaN NaN
1 NaN NaN NaN NaN NaN
2 NaN NaN NaN NaN NaN

我怎样才能得到我想要的结果?

【问题讨论】:

reindex 将不起作用。它获取带有当前索引的当前帧并对其进行排列,以便新帧将按照传递的索引的顺序具有索引。它不会神奇地从单个索引对齐到多索引。你得到所有的 NaN 因为在原始帧中的位置 [0, (a, None)][0, (bc, b)] (等)没有数据。我看不出pd.DataFrame(data, columns=multi_index) 有什么问题。如果没有,总会有可敬的groupby... @Kartik TY 用于输入。我不能简单地做pd.DataFrame(data, columns=multi_index),因为我只有df,而不是data 本身。这只是显示我想要到达的所需结果的代码。 【参考方案1】:

您可以直接将multiIndex分配给数据框的columns属性:

df.columns = multi_index
df

【讨论】:

难以置信...谢谢,我很确定它一定是这样简单的。请问,您是如何创建 DataFrame 的这种表示的? 你是指屏幕截图吗?通常最好不要在提问时使用图片,因为这样会更难为回答者生成数据框。【参考方案2】:
pd.concat([df.set_index('a')[['b', 'c']],
           df.set_index('a')[['d', 'e']]],
          axis=1, keys=['bc', 'de']).reset_index(col_level=1)

【讨论】:

这几乎是正确的,它确实将 a 放到了子级别。不过,我也可以使用它。 @Nras 很有趣,我可以发誓我在子关卡中看到了a,这就是为什么我把它和col_level=1 放在一起。删除该参数以将其放在您想要的位置。

以上是关于将一些 DataFrame 列重新索引为多索引的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 重置系列索引以删除多索引

Pandas 重置系列索引以删除多索引

如何重新索引多索引熊猫数据框?

如何将多索引列转换为熊猫数据框的单索引列?

只选择多索引DataFrame的一个索引

如何在特定级别重新排序多索引数据框列