如何基于类似条目在python中求和ND数组?

时间:2019-12-10 23:08:26

标签: python numpy

假设我在python中有一个由以下方案表示的ND数组:

["Event ID", "Event Location", "Event Cost"]
data = \
[[1, 0, 500]
[1, 0, 250]
[1, 1, 300]
[2, 0, 750]
[2, 1, 400]
[2, 1, 500]]

如何折叠此数组以汇总在相同事件位置发生的具有相同事件ID的条目的成本?最后将给我以下数组:

[[1, 0, 750]
[1, 1, 300]
[2, 0, 750]
[2, 1, 900]]

3 个答案:

答案 0 :(得分:1)

这是itertools.groupby的经典用例:

import itertools

result = [
    [i, loc, sum(cost for _, _, cost in costs)]
    for (i, loc), costs in itertools.groupby(data, key=lambda t: (t[0], t[1]))
]

答案 1 :(得分:1)

我更喜欢两种方法:

使用numpy_indexed软件包:

import numpy as np
import numpy_indexed as npi
a = np.array([[1, 0, 500],[1, 0, 250],[1, 1, 300],[2, 0, 750],[2, 1, 400],[2, 1, 500]])
_, sums = npi.group_by(a[:,:2]).sum(a[:,2])
result = np.hstack([_, np.vstack(sums)])
print(result)

输出:

_ = 
[[1 0], 
[1 1], 
[2 0], 
[2 1]]
sums = [750, 300, 750, 900]
np.vstack(sums) = 
[[750]
 [300]
 [750]
 [900]]
result = 
[[  1   0 750]
 [  1   1 300]
 [  2   0 750]
 [  2   1 900]]

使用pandas

df.groupby([0,1]).sum().reset_index().values

答案 2 :(得分:0)

我使用Pandas和以下代码来解决此问题:

selectSupplier(supplier){
    this.props.Obj.supplier = supplier
  }


  render() {
    //console.log("SUPPLIER", this.props)
    return (
      <div>
        <button onClick={this.showMenu}>
          Select Supplier
        </button>

        {
          this.state.showMenu
            ? (
              <div
                className="menu"
                ref={(element) => {
                  this.dropdownMenu = element;
                }}
              >
                <button value="Husky" onClick={this.selectSupplier("Husky")}> Husky </button>
                <button value="Shell" onClick={this.selectSupplier("Shell")}> Shell </button>
                <button value="Ultramar" onClick={this.selectSupplier("Ultramar")}> Ultramar</button>
              </div>
            )
            : (
              null
            )
        }
      </div>
    );