gpt4 book ai didi

python - 如何插入到 MultiIndex DataFrame 的特定位置?

转载 作者:太空狗 更新时间:2023-10-30 01:26:29 34 4
gpt4 key购买 nike

假设我有一个结构类似于以下内容的 pandas DataFrame。然而在实际上它可能会更大,并且 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

现在假设我想为每个“a”和“b”级别创建一个“总计”行。因此,将以上内容作为输入,我希望我的代码产生如下内容:

      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_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

我做错了什么?

最佳答案

这真的很烦人,但是 sorted Multiindex 的原因是性能更好。此外,如果未排序,MultiIndex 可能是一些 UnsortedIndexError如果需要通过MultiIndex进行选择。

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

df = result.groupby(level=0).sum()
df.index = [df.index, ['t'] * len(df.index)]
df1 = pd.concat([result, df]).sort_index().reindex(['s','u','t'], level=1)

df1 = pd.concat([result, df]).sort_index()
print (df1)
x y
a s 1 2
t 4 6
u 3 4
b s 5 6
t 12 14
u 7 8

df1 = df1.reindex(['s','u','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

更动态的解决方案:

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

另一种解决方案 setting with enlargement在带有 GroupBy.apply 的自定义函数中:

def f(x):
x.loc[(x.name, 't'),:] = x.sum()
return x

df = result.groupby(level=0, group_keys=False).apply(f)
print (df)
x y
a s 1.0 2.0
u 3.0 4.0
t 4.0 6.0
b s 5.0 6.0
u 7.0 8.0
t 12.0 14.0

关于python - 如何插入到 MultiIndex DataFrame 的特定位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45610153/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com