python - 通过跨多索引级别分布来乘以系列

标签 python pandas

这是 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/

相关文章:

python - C++ Exprtk 与 Python eval()

python - 遍历类型列表的字典值得到 TypeError : 'int' object is not iterable

python - 对两个列表的操作

python - 在 pandas 列中查找两个值的索引对的优化方法

python - 来自列的 Pandas 多索引

Python - 在 Pandas DataFrame 中取消嵌套单元格

python - 我可以将文件从 Google Endpoints 上传到 GCS 吗?

python - 如何从 SciPy 中的 scipy.stats.distribution 对象获取分布名称?

python-3.x - str 对 csv 格式的响应

python - 拆分/提取 Pandas 系列索引中的字符串并扩展为 DataFrame