Python 如何插入到多索引数据帧的特定位置?

Python 如何插入到多索引数据帧的特定位置?,python,pandas,Python,Pandas,假设我有一个pandas数据帧,它的结构与下面的类似。然而在 实践中,它可能要大得多,并且1级索引的数量以及2级索引的数量(每个1级索引)会有所不同,因此解决方案不应对此进行假设: index = pandas.MultiIndex.from_tuples([ ("a", "s"), ("a", "u"), ("a", "v"), ("b", "s"), ("b", "u")]) result = pandas.DataFrame([ [1, 2

假设我有一个pandas数据帧,它的结构与下面的类似。然而在 实践中,它可能要大得多,并且1级索引的数量以及2级索引的数量(每个1级索引)会有所不同,因此解决方案不应对此进行假设:

index = pandas.MultiIndex.from_tuples([
    ("a", "s"),
    ("a", "u"),
    ("a", "v"),
    ("b", "s"),
    ("b", "u")])

result = pandas.DataFrame([
    [1, 2],
    [3, 4],
    [5, 6],
    [7, 8],
    [9, 10]], index=index, columns=["x", "y"])
看起来是这样的:

      x   y
a s   1   2
  u   3   4
  v   5   6
b s   7   8
  u   9  10
      x   y
a s   1   2
  u   3   4
  v   5   6
  t   9  12
b s   7   8
  u   9  10
b t  16  18
现在让我们假设我想为每个“a”和“b”级别创建一个“总计”行。因此,考虑到上述输入,我希望我的代码生成如下内容:

      x   y
a s   1   2
  u   3   4
  v   5   6
b s   7   8
  u   9  10
      x   y
a s   1   2
  u   3   4
  v   5   6
  t   9  12
b s   7   8
  u   9  10
b t  16  18
以下是我目前掌握的代码:

# Calculate totals
for level, _ in result.groupby(level=0):

    # work out the global total for that desk:
    x_sum = result.loc[level]["x"].sum()
    y_sum = result.loc[level]["y"].sum()

    result = result.append(pandas.DataFrame([[x_sum, y_sum]], columns=result.columns, index=pandas.MultiIndex.from_tuples([(level, "t")])))
但这会导致“总计”列追加到末尾:

      x   y
a s   1   2
  u   3   4
  v   5   6
b s   7   8
  u   9  10
a t   9  12
b t  16  18
使用
result.sort\u index()
进行排序也不能满足我的要求:

      x   y
a s   1   2
  t   9  12
  u   3   4
  v   5   6
b s   7   8
  t  16  18
  u   9  10
我做错了什么

result.reindex(pandas.MultiIndex.from_tuples([
("a", "s"),
("a", "u"),
("a", "t"),
("b", "s"),
("b", "u"),
("b", "t")
]))
给我

        x   y
a   s   1   2
    u   3   4
    t   4   6
b   s   5   6
    u   7   8
    t   12  14

这确实令人烦恼,但排序多索引的原因是性能更好。如果未排序,也可以使用
多索引
,如果需要,可以通过
多索引
进行选择

但如果真的需要改变标签的位置是可以使用的

更具活力的解决方案:

print (result.index.get_level_values(1).unique().tolist())
['s', 'u']

df1 = df1.reindex(result.index.get_level_values(1).unique().tolist() + ['t'], level=1)
print (df1)
      x   y
a s   1   2
  u   3   4
  t   4   6
b s   5   6
  u   7   8
  t  12  14

另一个具有自定义功能的解决方案具有:


谢谢这可能会奏效,但我不知道实际代码中的实际结构是什么(即我不能只写出所有的索引值)。我已经修改了这个问题,试图让这一点更清楚。如果二级索引的数量发生变化,这将如何工作?我在问题中提到了这一点,但意识到示例并没有真正说明这一点,所以我调整了示例代码,使其具有额外的级别1条目(“v”)。