为了账号安全,请及时绑定邮箱和手机立即绑定

修改 pandas MultiIndex DataFrame 中每组的最后一行

修改 pandas MultiIndex DataFrame 中每组的最后一行

动漫人物 2023-08-03 17:04:24
我下面有一个示例多索引数据框(实际上要大得多)。我想将“col”列中每个级别的最后一行 = 0 索引设置为 100。像这样的数据框mux = pd.MultiIndex.from_arrays([list('aaabbbcccddd'),list('tuvwacdjpkqz')],names=['level 0', 'level 1'])df = pd.DataFrame({'col': np.arange(len(mux))}, mux)df所以2、5、8和11都将被替换为100。我已经尝试过这些解决方案,但我不知道如何正确设置该值。我可以获得布尔系列和最后一行的数据框,但似乎无法弄清楚如何将它们设置为新值。我在下面尝试过什么df.groupby(level=0).tail(1).col = 100df.groupby(level=0).tail(1).coldf.iloc[-1, df.columns.get_loc('col')] = 100最后一行代码来自上一篇文章,但它只设置 df 的最后一行,而不是在索引级别
查看完整描述

1 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

你很接近,使用loc你index的结果并分配:


df.loc[df.groupby(level=0).tail(1).index, 'col'] = 100

df


                 col

level 0 level 1     

a       t          0

        u          1

        v        100

b       w          3

        a          4

        c        100

c       d          6

        j          7

        p        100

d       k          9

        q         10

        z        100

这是您的分组结果:


df.groupby(level=0).tail(1)

 

                 col

level 0 level 1     

a       v          2

b       c          5

c       p          8

d       z         11

获取要更改的行的索引.index:


df.groupby(level=0).tail(1).index


MultiIndex([('a', 'v'),

            ('b', 'c'),

            ('c', 'p'),

            ('d', 'z')],

           names=['level 0', 'level 1'])

您有索引标签,因此您将需要loc(而不是iloc)来完成最终的分配步骤。


查看完整回答
反对 回复 2023-08-03
  • 1 回答
  • 0 关注
  • 71 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信