【发布时间】:2013-07-07 08:11:33
【问题描述】:
我正在使用 MultiIndexed pandas DataFrame,并希望将 DataFrame 的子集乘以某个数字。
它与 this 相同,但具有 MultiIndex。
>>> d = pd.DataFrame({'year':[2008,2008,2008,2008,2009,2009,2009,2009],
'flavour':['strawberry','strawberry','banana','banana',
'strawberry','strawberry','banana','banana'],
'day':['sat','sun','sat','sun','sat','sun','sat','sun'],
'sales':[10,12,22,23,11,13,23,24]})
>>> d = d.set_index(['year','flavour','day'])
>>> d
sales
year flavour day
2008 strawberry sat 10
sun 12
banana sat 22
sun 23
2009 strawberry sat 11
sun 13
banana sat 23
sun 24
到目前为止,一切都很好。但是,假设我发现所有星期六的数据都只有应有的一半!我想将所有 sat 销售额乘以 2。
我的第一次尝试是:
sat = d.xs('sat', level='day')
sat = sat * 2
d.update(sat)
但这不起作用,因为变量sat 已经失去了索引的day 级别:
>>> sat
sales
year flavour
2008 strawberry 20
banana 44
2009 strawberry 22
banana 46
所以 pandas 不知道如何将新的销售数据加入旧数据框。
我很快就发现了:
>>> sat = d.xs('sat', level='day', copy=False)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\pandas\core\frame.py", line 2248, in xs
raise ValueError('Cannot retrieve view (copy=False)')
ValueError: Cannot retrieve view (copy=False)
我不知道这个错误是什么意思,但我觉得我是在鼹鼠山上造山。有谁知道这样做的正确方法?
提前致谢, 抢
【问题讨论】:
-
对于那些在 MultiIndexing 上寻找更详细解决方案的用户,check this answer below
-
如果您有兴趣了解更多关于切片和过滤多索引数据帧的信息,请查看我的帖子:How do I slice or filter MultiIndex DataFrame levels?。