当前位置: 首页 > 知识库问答 >
问题:

熊猫:从多级列索引中删除一个级别?

慕容宇
2023-03-14

如果我有一个多级列索引

>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> pd.DataFrame([[1,2], [3,4]], columns=cols)
    a
   ---+--
    b | c
--+---+--
0 | 1 | 2
1 | 3 | 4

我如何才能降低该指数的“a”级,因此我最终得到:

    b | c
--+---+--
0 | 1 | 2
1 | 3 | 4

共有3个答案

长孙嘉
2023-03-14

从Pandas 0.24.0开始,我们现在可以使用DataFrame.droplevel():

cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
df = pd.DataFrame([[1,2], [3,4]], columns=cols)

df.droplevel(0, axis=1) 

#   b  c
#0  1  2
#1  3  4

如果您想保持数据帧方法链的滚动,这是非常有用的。

隗瑞
2023-03-14

另一种删除索引的方法是使用列表理解:

df.columns = [col[1] for col in df.columns]

   b  c
0  1  2
1  3  4

如果您希望合并两个级别的名称,如下面的示例中底部级别包含两个“y”,则此策略也很有用:

cols = pd.MultiIndex.from_tuples([("A", "x"), ("A", "y"), ("B", "y")])
df = pd.DataFrame([[1,2, 8 ], [3,4, 9]], columns=cols)

   A     B
   x  y  y
0  1  2  8
1  3  4  9

删除顶层将留下两列索引为“y”。这可以通过将名称与列表合并来避免。

df.columns = ['_'.join(col) for col in df.columns]

    A_x A_y B_y
0   1   2   8
1   3   4   9

这是我做群比后遇到的一个问题,我花了一段时间才找到解决这个问题的另一个问题。我根据这里的具体情况调整了该解决方案

沈子昂
2023-03-14

您可以使用MultiIndex.droplevel

>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> df = pd.DataFrame([[1,2], [3,4]], columns=cols)
>>> df
   a   
   b  c
0  1  2
1  3  4

[2 rows x 2 columns]
>>> df.columns = df.columns.droplevel()
>>> df
   b  c
0  1  2
1  3  4

[2 rows x 2 columns]
 类似资料:
  • 我想知道是否可以从一个多索引级别中选择多个项目? 假设我有一个大熊猫数据帧,如下所示: 我想使用dataframe的lvl_2选择特定列 尝试类似< code>df.xs(['c ',' e'],level='lvl_2 ',axis=1)的内容会导致错误: 关键错误:“e”

  • 问题内容: 我创建了一个从,当我重新采样一些数据,象这样一个数:其中是: 这产生了一个看起来像这样的系列: 索引看起来像: 我不希望第二列作为索引。理想情况下,我将第1列作为“日期”,将第2列作为“销售”(删除索引的第二层)。我不太清楚如何重新配置​​索引。 问题答案: 只需致电: 有多种删除列的方法: 调用两次并指定一列: 重置索引后删除列: 重置后致电: 然后,在重置索引后,只需重命名列

  • 问题内容: 我正在尝试使用pandas创建一个,但是当我将数据导出到它时,我得到了一个额外的列 因此,我的结果是: 但是,预期结果是: 问题答案: 您所看到的是索引列。刚刚设置:

  • 问题内容: 我有一个数据框,具有以下的multiindex列: 如何将列索引级别展平/合并为:“ Level1 | Level2”,例如,。等等?如果这不可能,是否有办法像我上面所做的那样不创建多索引列? 问题答案: 您可以随时更改列:

  • 问题内容: 我有一个带有列“ A”和“ B”的多索引数据框。 有没有一种方法可以通过在多索引的一列上进行过滤而不选择将索引重新设置为单列索引来选择行? 例如。 问题答案: 一种方法是使用Index方法: 在0.13,你就可以使用与参数: 注意:如果这是列MultiIndex而不是索引,则可以使用相同的技术:

  • 问题内容: 我有一些数据,导入时会得到以下不需要的列,我正在寻找一种删除所有这些数据的简便方法 它们被0索引索引,所以我尝试了类似 但这不是很有效。我尝试编写一些for循环,但这使我感到震惊,因为熊猫的行为不佳。因此,我在这里问这个问题。 我已经看到了一些类似的示例(投递多列pandas),但这无法回答我的问题。 问题答案: 我不知道您所说的低效率是什么意思,但是如果您指的是打字,那么选择感兴趣的