在Pandas MultiIndex Dataframe 中设置值

bweufnob  于 2023-03-16  发布在  其他
关注(0)|答案(2)|浏览(183)

我想swaplevel和设置值后,选择。
在本例中,我想将“c1”列设置为1,但它似乎没有像我预期的那样工作。
编辑:未明确表达:我想把C1列的值设为1,而不是重命名C1。

import numpy as np
import pandas as pd
mix = pd.MultiIndex.from_tuples([('a1','b1','c1'),('a1','b2','c1'),('a1','b3','c2')])
df = pd.DataFrame(np.zeros((3,3)),columns=mix)
print(df)
df.swaplevel(0,2,axis=1).loc[:,'c1']=1  
print(df)

Output
        a1          
        b1   b2   b3
        c1   c1   c2
    0  0.0  0.0  0.0
    1  0.0  0.0  0.0
    2  0.0  0.0  0.0

' FutureWarning: In a future version, `df.iloc[:, i] = newvals` will attempt \nto set the values inplace instead of always setting a new array. \nTo retain the old behavior, use either `df[df.columns[i]] = newvals` or, \nif columns are non-unique, `df.isetitem(i, newvals)`\n'
7lrncoxx

7lrncoxx1#

不要弄乱你的索引,使用advanced indexing

df.loc[:, (slice(None), slice(None), 'c1')] = 1

或者:

df.loc[:, pd.IndexSlice[:, :, 'c1']] = 1

适当修改df

a1        
  b1 b2   b3
  c1 c1   c2
0  1  1  0.0
1  1  1  0.0
2  1  1  0.0
5fjcxozz

5fjcxozz2#

swaplevel + assign

df.swaplevel(0, 2, axis=1).assign(c1=1)

结果

c1      c2
  b1 b2   b3
  a1 a1   a1
0  1  1  0.0
1  1  1  0.0
2  1  1  0.0

相关问题