我在下面有一个示例多索引数据框(实际上更大)。我想将“ 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的最后一行,而不是在索引级别
答案 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
)。