这是 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
现在我想根据年份和日期将每个数字乘以不同的数字,存储为系列
:
>>> 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中非常常见的操作。
最佳答案
您似乎正在为被乘数的每一侧定义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 。该解决方案实际上只是将该解决方案嵌入到广播数字中(例如 mul/add ...)。
关于python - 通过跨多索引级别分布来乘以系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22920227/