Python 在具有2个以上级别索引的数据帧中的列中设置值

Python 在具有2个以上级别索引的数据帧中的列中设置值,python,pandas,Python,Pandas,我想更改dataframe列中的一个值,该列具有两级索引,且具有非唯一值: df = DataFrame(data = {'col1':[1,2,3,4],'col2':[1,2,3,4]}, index =MultiIndex.from_tuples([('a','b'),('a','c'),('a','b'),('a','d')])) df.sort_index(inplace=True) df col1 col2 a b 1 1 b 3

我想更改dataframe列中的一个值,该列具有两级索引,且具有非唯一值:

df = DataFrame(data = {'col1':[1,2,3,4],'col2':[1,2,3,4]}, index =MultiIndex.from_tuples([('a','b'),('a','c'),('a','b'),('a','d')]))
df.sort_index(inplace=True)
df
        col1   col2
a   b    1      1
    b    3      3
    c    2      2
    d    4      4
我想更改“col2”中索引不唯一的值,如
(a,b)

假设我想将“col2”中的“1”更改为不同的数字(假设我不知道“1”位于第一行,我需要搜索他在哪一行,然后更改它)

我尝试了以下方法:

df.reset_index(inplace=True)
df.set_index(['level_0','level_1','col1'])
这将生成唯一索引的数据帧:

                       col2
level_0 level_1 col1    
  a        b     1      1
                 3      3
           c     2      2
           d     4      4
但是,当我尝试使用.ix机制就地更改值时,出现以下错误:

df.ix['a','b',1,'col2'] = 3
IndexingError: only tuples of length <= 2 supported
df.ix['a','b',1,'col2']=3

IndexingError:只有长度的元组需要将级别指定为元组

In [12]: df.ix[('a','b'),'col2'] = 3

In [13]: df
Out[13]: 
     col1  col2
a b     1     3
  b     3     3
  c     2     2
  d     4     4

[4 rows x 2 columns]
这种语法

df.ix['a','b']
“有效”是因为它可以猜出你想做什么,但既不可靠也不推荐。始终使用具有多索引的元组

In [19]: df.reset_index()
Out[19]: 
  level_0 level_1  col1  col2
0       a       b     1     1
1       a       c     2     2
2       a       b     3     3
3       a       d     4     4

[4 rows x 4 columns]

In [20]: df.reset_index().set_index(['level_0','level_1','col1'])
Out[20]: 
                      col2
level_0 level_1 col1      
a       b       1        1
        c       2        2
        b       3        3
        d       4        4

[4 rows x 1 columns]
为了处理新的多索引,您需要指定一个变量

In [21]: df2 = df.reset_index().set_index(['level_0','level_1','col1'])

In [22]: df2.ix[('a','b',1)] = 10

In [23]: df2
Out[23]: 
                      col2
level_0 level_1 col1      
a       b       1       10
        c       2        2
        b       3        3
        d       4        4

[4 rows x 1 columns]

Jeff,这不好用-它同时更改了('a','b')条目,而我只想更改第一行。而且,这不起作用:
df.ix[('a','b',1)]
。不仅如此,似乎还有一个bug,因为一旦我运行,索引就被重新设置了。几乎所有操作都会返回一个新的数据帧(除非您使用
inplace
)。那么你确定你是在正确的框架上操作的吗?您的示例似乎表明您正在打印
set\u index
操作的输出,但您的选择在此之前。一般来说,
inplace
操作也更难理解。Jeff,如果他想赋值,你不应该使用
.loc
而不是
.ix
?在这种情况下,它们是等价的(通常也是一样;对
loc
进行更多验证是不同的)
In [21]: df2 = df.reset_index().set_index(['level_0','level_1','col1'])

In [22]: df2.ix[('a','b',1)] = 10

In [23]: df2
Out[23]: 
                      col2
level_0 level_1 col1      
a       b       1       10
        c       2        2
        b       3        3
        d       4        4

[4 rows x 1 columns]