在 pandas MultiIndex DataFrame 中按级别求和列
Posted
技术标签:
【中文标题】在 pandas MultiIndex DataFrame 中按级别求和列【英文标题】:Sum columns by level in a pandas MultiIndex DataFrame 【发布时间】:2018-06-24 15:25:13 【问题描述】:我的 df 带有多索引列。我所有的值都是浮点数,我想将值与第一级多索引合并。详情请看下文。
first bar baz foo
second one two one two one
A 0.895717 0.805244 1.206412 2.565646 1.431256
B 0.410835 0.813850 0.132003 0.827317 0.076467
C 1.413681 1.607920 1.024180 0.569605 0.875906
first bar baz foo
A (0.895717+0.805244) (1.206412+2.565646) 1.431256
B (0.410835+0.813850) (0.132003+0.827317) 0.076467
C (1.413681+1.607920) (1.024180+0.569605) 0.875906
这些值实际上是添加的(我只是不想做这一切:))。底线是我只想升级(我猜更高级别)并在索引中添加所有值。请让我知道这样做的好方法。谢谢!
【问题讨论】:
【参考方案1】:我相信您正在寻找沿第一个轴的groupby
。
df.groupby(level=0, axis=1).sum()
或者(更简洁),
df.sum(level=0, axis=1)
sum
的 level
参数暗示分组。
df
first bar baz foo
second one two one two one two
A 2 3 3 4 10 8
B 22 16 7 3 2 26
C 4 5 1 9 6 5
df.sum(level=0, axis=1)
first bar baz foo
A 5 7 18
B 38 10 28
C 9 10 11
在性能方面,上述两种方法几乎没有任何区别(后者要快几个滴答声)。
【讨论】:
df.sum(axis=1, level='first')
也适用于 OP 情况,索引级别 0 有名称。
@mins 利用命名索引,这是一个很好的标注。谢谢!【参考方案2】:
请记住,df.sum(level, axis)
仅在您将列设置为多索引时才有效。例如,
D = 'one': range(6),
'two': range(1,7),
'CAT1': 'A A A A A A'.split(),
'CAT2': 'B B B C C C'.split(),
'CAT3': 'D D E E F F'.split()
df = pd.DataFrame(D)
df = df.set_index('CAT1 CAT2 CAT3'.split())
df
one two
CAT1 CAT2 CAT3
A B D 0 1
D 1 2
E 2 3
C E 3 4
F 4 5
F 5 6
如果您的数据采用这种形式,则必须使用df.groupby(level=n).sum(axis=1)
df.groupby(level = 0).sum(axis=1)
one two
CAT1
A 15 21
df.groupby(level = 1).sum(axis=1)
one two
CAT2
B 3 6
C 12 15
df.groupby(level = 2).sum(axis=1)
one two
CAT3
D 1 3
E 5 7
F 9 11
如果您尝试跳过groupby
,
df.sum(level = 1, axis=1)
ValueError: level > 0 or level < -1 only valid with MultiIndex
这是一个有趣的错误,因为,
df.index
MultiIndex(levels=[[u'A'], [u'B', u'C'], [u'D', u'E', u'F']],
labels=[[0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 1], [0, 0, 1, 1, 2, 2]],
names=[u'CAT1', u'CAT2', u'CAT3'])
【讨论】:
以上是关于在 pandas MultiIndex DataFrame 中按级别求和列的主要内容,如果未能解决你的问题,请参考以下文章
在 Pandas 中使用 .loc 和 MultiIndex
在 Pandas 中将两个 MultiIndex 级别合并为一个
pandas - 如何使用 MultiIndex 在 DataFrame 的深层检索最小值索引
pandas:将两个 DataFrame 与已排序的 MultiIndex 连接起来,使得结果具有已排序的 MultiIndex