这是this question的MultiIndex版本。
考虑DataFrame
销售数字:
sales = 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]})
sales = sales.set_index(['year','flavour','day'])
>>> 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
现在我想根据年份和将每个数字乘以不同的数字,存储为Series
:
>>> sales = pd.DataFrame([[2008, 'sat', 0], [2008, 'sun', 1], [2009, 'sat', 2], [2009, 'sun', 3]])
>>> sales = sales.set_index([0, 1])
2
0 1
2008 sat 0
sun 1
2009 sat 2
sun 3
是否有一种巧妙的方法可以将sales
中的每个数字乘以mul
的相关元素?这是SQL中非常常见的操作。
答案 0 :(得分:2)
您似乎正在为被乘数的每一侧定义sales
。因此将第二部分定义为m
(并命名索引的级别)。
In [28]: m = pd.DataFrame([[2008, 'sat', 0], [2008, 'sun', 1], [2009, 'sat', 2], [2009, 'sun', 3]],columns=['year','day','value']).set_index(['year','day'])
In [29]: m
Out[29]:
value
year day
2008 sat 0
sun 1
2009 sat 2
sun 3
[4 rows x 1 columns]
简单合并
In [30]: x = pd.merge(sales.reset_index(),m.reset_index(),on=['year','day'])
集
In [31]: x['sales_value'] = x['sales']*x['value']
重置索引
In [32]: x.set_index(['year','flavour','day'])
Out[32]:
sales value sales_value
year flavour day
2008 strawberry sat 10 0 0
banana sat 22 0 0
strawberry sun 12 1 12
banana sun 23 1 23
2009 strawberry sat 11 2 22
banana sat 23 2 46
strawberry sun 13 3 39
banana sun 24 3 72
[8 rows x 3 columns]
这项工作正在进行中,但仍然是一个悬而未决的问题。见here。 soln实际上只是将这个soln嵌入广播数字(.e.g mul / add ...)。
答案 1 :(得分:0)
混淆可能是销售(不必要地)是一个DataFrame,我相信这只适用于Series。使用.squeeze()进行转换如下:
sales.squeeze().mul(mul, level=2)