91181


3列入れ子配列[[i,j,k],[l,m,n],...]から、2列(i=lかつj=m)が一致しているときのみ、もう一列を足し合わせたい(k+n...)と考えております。

言葉でうまくまとめられないので、画像を用いて説明すると現在、  
[![画像の説明をここに入力](https://i.stack.imgur.com/B4Tx3.png)](https://i.stack.imgur.com/B4Tx3.png)

のような、配列のデータを持っています。  
このうち先頭の二列が一致する配列の場合、末尾の一列を足し合わせる処理を行いたいです。

(例)[-0.01,37.225,49.526255],[-0.01,37.225,37.288825])の場合に、  
→[-0.01,37.225,86.81508]

全配列数は6000ほどで、先頭の二列が一致するのは一回のみとは限りません。  
上記の処理により最終的には、先頭の二列が同じ組が全配列内に存在しないようにしたいです。

お手数をお掛けして申し訳ございませんが、どなたか知恵を授けていただけると幸いです。  
よろしくお願い致します。

[追記]  
現在考えているコードを張ります。勉強を始めたばかりで、意味不明なコードになっているかも知れません。

[![画像の説明をここに入力](https://i.stack.imgur.com/OqpOq.png)](https://i.stack.imgur.com/OqpOq.png)


CC BY-SA 4.0
2022-09-19T12:27:16.857
91178
2022-09-20T22:38:48.630
2022-09-20T22:38:48.630
54449
54449
question
python array
3列入れ子配列[[i,j,k],[l,m,n],...]から、2列(i=lかつj=m)が一致しているときのみ、もう一列を足し合わせたい(k+n...)


元の並びは保持していません。Pandas使用された方が良いかと思いますが、numpy.ndarrayで実装してみました。

[code]

    import numpy as np
    
    a = np.random.randint(4, 10, (10, 3))
    print(a)
    #array([[5, 8, 4],
    #       [5, 4, 6],
    #       [5, 8, 9],
    #       [5, 7, 8],
    #       [4, 4, 7],
    #       [8, 7, 8],
    #       [9, 6, 6],
    #       [4, 8, 8],
    #       [9, 9, 4],
    #       [7, 7, 4]])
    
    first = np.unique(a[:,0])
    second = np.unique(a[:,1])
    
    result = []
    for f in first:
        for s in second:
            u, counts = np.unique((np.where(a[:,0] == f)[0].tolist()+np.where(a[:,1] == s)[0].tolist()), return_counts=True)
            if len(np.where(counts > 1)[0]) > 1:
                result.append(np.hstack((a[u[counts != 1]][0, 0:2], a[u[counts != 1],2].sum())).tolist())
            else:
                tmp = a[np.where((a[:,0] == f) & (a[:,1] == s))[0]]
                if len(tmp) > 0:
                    result.append(tmp[0].tolist())
                    
    result = np.array(result)
    print(result)
    #array([[ 4,  4,  7],
    #       [ 4,  8,  8],
    #       [ 5,  4,  6],
    #       [ 5,  7,  8],
    #       [ 5,  8, 13],
    #       [ 7,  7,  4],
    #       [ 8,  7,  8],
    #       [ 9,  6,  6],
    #       [ 9,  9,  4]])
    
[/code]


CC BY-SA 4.0
2022-09-19T14:20:36.747
91179
2022-09-19T14:20:36.747
39819
91178
answer


並びは保持しない (pandasとかじゃない) Pythonでの方法  
(別解の初期処理そのまま利用させてもらいました)

[code]

    from itertools import groupby
    import numpy as np
    
    arr = np.random.randint(4, 10, (20, 3))
    
    grpkey = lambda x: [x[0], x[1]]
    res = [k +[sum(m[-1]for m in g)]
             for k,g in groupby(sorted(arr, key=grpkey), grpkey)]
    
    
    # 結果の表示
    for k,g in groupby(sorted(arr, key=grpkey), grpkey):
        print(k, list(g))
    # [4, 8] [array([4, 8, 8])]
    # [5, 4] [array([5, 4, 4])]
    # [5, 5] [array([5, 5, 6])]
    # [5, 6] [array([5, 6, 7])]
    # [5, 7] [array([5, 7, 8]), array([5, 7, 6]), array([5, 7, 7]), array([5, 7, 6]), array([5, 7, 5])]
    # [5, 8] [array([5, 8, 4])]
    # [6, 4] [array([6, 4, 6])]
    # [6, 9] [array([6, 9, 8])]
    # [7, 7] [array([7, 7, 4])]
    # [7, 9] [array([7, 9, 6]), array([7, 9, 8])]
    # [8, 5] [array([8, 5, 5]), array([8, 5, 8])]
    # [8, 9] [array([8, 9, 4]), array([8, 9, 4])]
    # [9, 8] [array([9, 8, 4])]
    
    display(res)
    # [[4, 8, 8],
    #  [5, 4, 4],
    #  [5, 5, 6],
    #  [5, 6, 7],
    #  [5, 7, 32],
    #  [5, 8, 4],
    #  [6, 4, 6],
    #  [6, 9, 8],
    #  [7, 7, 4],
    #  [7, 9, 14],
    #  [8, 5, 13],
    #  [8, 9, 8],
    #  [9, 8, 4]]
    
[/code]


CC BY-SA 4.0
2022-09-19T15:20:48.880
91180
2022-09-19T15:20:48.880
43025
91178
answer

[code]

    import pandas as pd
    from pprint import pprint
    
    data_list_ACF_2 = [
        [-0.01, 37.225, 49.526255],
        [-0.0098, 37.225, 11.429136],
        [-0.0096, 37.225, 7.31264],
        [-0.0094, 37.225, 2.089326],
        [-0.01, 37.225, 37.288825]]
    
    df = pd.DataFrame(data=data_list_ACF_2)
    data_list_ACF_3 = df.groupby([0, 1], sort=False, as_index=False)[2].sum().values.tolist()
    
    pprint(data_list_ACF_3)
    
    #
    [[-0.01, 37.225, 86.81508],
     [-0.0098, 37.225, 11.429136],
     [-0.0096, 37.225, 7.31264],
     [-0.0094, 37.225, 2.089326]]
    
[/code]


CC BY-SA 4.0
2022-09-19T16:00:15.943
91181
2022-09-19T16:09:43.543
2022-09-19T16:09:43.543
47127
47127
91178
answer