Python 在具有2个以上级别索引的数据帧中的列中设置值
我想更改dataframe列中的一个值,该列具有两级索引,且具有非唯一值: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
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]