【问题标题】:Multidimensional multiplication in Pandas pivot tablesPandas 数据透视表中的多维乘法
【发布时间】:2020-09-25 03:51:40
【问题描述】:

考虑一个像这样的 Pandas 数据透视表:

                  E
A   B   C     D    
bar one large 4   6
        small 5   8
    two large 7   9
        small 6   9
foo one large 2   9
        small 1   2
    two small 3  11

我想将具有A = bar 的每个E 条目乘以l 和A = foo 乘以m。对于具有B = one 的条目,我想将它们乘以n,将B = two 乘以p。对于每个维度的每个级别,我都有一个不同的值,我想将E 乘以。结果表将具有E 中的每个原始值乘以[表中的维数(四个)] 变量。

在 Python 中最快的方法是什么?我的实际表是高维表,作为优化过程的一部分,需要多次执行此操作。

我使用以下代码创建了数据透视表:

df = pd.DataFrame({"A": ["foo", "foo", "foo", "foo", "foo",
                         "bar", "bar", "bar", "bar"],
                   "B": ["one", "one", "one", "two", "two",
                         "one", "one", "two", "two"],
                   "C": ["small", "large", "large", "small",
                         "small", "large", "small", "small",
                         "large"],
                   "D": [1, 2, 2, 3, 3, 4, 5, 6, 7],
                   "E": [2, 4, 5, 5, 6, 6, 8, 9, 9]})

table = pd.pivot_table(df, values='D', index=['A', 'B', 'C', 'D'], aggfunc=np.sum)

要乘以的值存储在字典中。

例如:

{'A': {'bar': 0.5, 'foo': 0.2}, 
'B': {'one': 0.1, 'two': 0.3},
'C': {'large': 2, 'small': 4},
'D': {1: 10, 2: 20, 3: 30, 4: 40, 5: 50, 6: 60, 7: 70}} 

使用此字典,第一行的结果将是 6 * 0.5 * 0.1 * 2 * 40 = 24。

【问题讨论】:

    标签: python arrays pandas numpy multidimensional-array


    【解决方案1】:

    您可以在使用index.get_level_values 获得的索引的每个级别中使用map。

    table['Emult'] = table['E']*np.prod([table.index.get_level_values(lv).map(d[lv]) 
                                         for lv in table.index.names], 
                                        axis=0)
    print (table)
                      E  Emult
    A   B   C     D           
    bar one large 4   6   24.0
            small 5   8   80.0
        two large 7   9  189.0
            small 6   9  324.0
    foo one large 2   9    7.2
            small 1   2    1.6
        two small 3  11   79.2
    

    d 是您在问题中给出的字典

    【讨论】:

      猜你喜欢
      • 2016-01-15
      • 1970-01-01
      • 2020-08-30
      • 2019-03-29
      • 2021-01-17
      • 1970-01-01
      • 2023-03-23
      • 2020-06-05
      • 2016-09-15
      相关资源
      最近更新 更多