通过跨MultiIndex级别分布乘以系列

时间:2014-04-07 18:27:17

标签: python pandas

这是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中非常常见的操作。

2 个答案:

答案 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)