在具有多于2级索引的数据框架中的列中设置值

时间:2014-03-26 16:45:51

标签: python pandas

我想更改列中的值,其中数据框具有两个具有非唯一值的级别索引:

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)

df.ix['a','b']

        col1  col2
a   b    1     1
    b    3     3

让我们说我想改变' 1' in' col2'使用不同的数字(假设我不知道' 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

关于如何做到这一点的任何想法?是改变非唯一的两级索引数据帧的列值还是三级或更多唯一索引的数据帧真的不可能?

1 个答案:

答案 0 :(得分:2)

您需要将级别指定为元组

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]