修改熊猫MultiIndex DataFrame中每个组的最后一行

时间:2020-09-13 19:55:43

标签: python pandas multi-index

我在下面有一个示例多索引数据框(实际上更大)。我想将“ 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的wold都将替换为100。我尝试了这些解决方案,但我不知道如何正确设置该值。我可以得到布尔系列和最后一行的数据框,但似乎无法弄清楚如何将它们设置为新值。我在下面尝试过的

df.groupby(level=0).tail(1).col = 100
df.groupby(level=0).tail(1).col
df.iloc[-1, df.columns.get_loc('col')] = 100

最后一行代码来自上一篇文章,但它仅设置df的最后一行,而不是在索引级别

1 个答案:

答案 0 :(得分:0)

您接近了,将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)。