通过在多索引级别上分布来对序列进行乘法

2024-06-16 11:04:24 发布

您现在位置:Python中文网/ 问答频道 /正文

这是this question的多索引版本。你知道吗

考虑一下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中非常常见的操作。你知道吗


Tags: dataframeindex数字thisyearsatpdsun
2条回答

混淆可能是销售是(不必要的)一个数据帧,我相信这只适用于系列。使用.squeeze()进行如下转换:

sales.squeeze().mul(mul, level=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嵌入广播数字中(例如mul/add…)。你知道吗

相关问题 更多 >