У меня есть 2d-массив и dataframe df с координатами x и y, я хочу сопоставить значения 2D-массива с соответствующими координатами x и y в кадре данных в новом столбце

Массив

data =

array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
       [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

Дф =

    index   y   x   result
        0   4   8   NaN
        1   8   8   NaN
        2   8   4   NaN
        3   6   1   NaN
        4   5   3   NaN
        5   1   5   NaN
        6   6   6   NaN
        7   6   12  NaN
        8   8   3   NaN
        9   6   3   NaN
        10  5   10  NaN
        11  3   6   NaN
        12  2   5   NaN
        13  2   4   NaN
        14  5   7   NaN
        15  2   8   NaN
        16  1   8   NaN
        17  5   9   NaN
        18  6   2   NaN
        19  4   5   NaN
        20  4   10  NaN
        21  7   6   NaN
        22  2   1   NaN
        23  3   10  NaN
        24  5   1   NaN
        25  8   2   NaN
        26  1   4   NaN
        27  6   4   NaN
        28  1   7   NaN
        29  4   11  NaN
        30  8   9   NaN
        31  6   7   NaN
        32  3   7   NaN
        33  6   10  NaN
        34  1   10  NaN
        35  6   11  NaN
        36  7   7   NaN
        37  3   5   NaN
        38  3   11  NaN
        39  1   11  NaN
        40  6   9   NaN
        41  5   8   NaN
        42  1   12  NaN
        43  3   3   NaN
        44  5   12  NaN
        45  3   8   NaN
        46  6   5   NaN
        47  3   12  NaN
        48  3   4   NaN
        49  5   11  NaN
        50  2   9   NaN
        51  7   1   NaN
        52  7   5   NaN
        53  7   10  NaN
        54  8   10  NaN
        55  2   11  NaN
        56  2   12  NaN
        57  8   11  NaN
        58  7   11  NaN
        59  8   7   NaN
        60  7   9   NaN
        61  4   7   NaN
        62  4   12  NaN
        63  2   7   NaN
        64  1   6   NaN
        65  3   9   NaN
        66  4   9   NaN
        67  4   6   NaN
        68  1   2   NaN
        69  5   4   NaN
        70  8   1   NaN
        71  8   5   NaN
        72  2   3   NaN
        73  5   5   NaN
        74  8   6   NaN
        75  4   1   NaN
        76  1   9   NaN
        77  2   6   NaN
        78  7   8   NaN
        79  4   2   NaN
        80  5   2   NaN
        81  7   3   NaN
        82  2   2   NaN
        83  7   4   NaN
        84  4   3   NaN
        85  3   1   NaN
        86  1   1   NaN
        87  6   8   NaN
        88  1   3   NaN
        89  4   4   NaN
        90  7   2   NaN
        91  5   6   NaN
        92  3   2   NaN
        93  2   10  NaN
        94  7   12  NaN
        95  8   12  NaN

Код

 for y,x in np.ndindex(data.shape):
        for i,j in zip(df.x, df.y): 
            if (i - 1 ==  data[x]).all() & ( j - 1 ==  data[y]).all():
                df['result'] == result[x,y]

i-1 и j-1 выполняется, потому что индекс массива np от 0, но в df он начинается с 1

Выход

df =
  

        index   y   x   result
            0   4   8   0
            1   8   8   0
            2   8   4   0
            3   6   1   0
            4   5   3   0
            5   1   5   0
            6   6   6   0
            ......
0
alex3465 15 Фев 2021 в 14:26

2 ответа

Лучший ответ

Код:

data_df = pd.DataFrame(data)
result = [data_df.loc[row['y']-1, row['x']-1] for index, row in df.iterrows()]
df['result'] = result
print(df)

Выход:

    x   y   result  
0   4   8       0
1   8   8       0
2   8   4       0
3   6   1       0
4   5   3       0
.. ..  ..     ...
91  5   6       0
92  3   2       1
93  2  10       1
94  7  12       0
95  8  12       0
0
Roman 15 Фев 2021 в 12:39

Простое решение:

df['result'] = [data[coords['y']-1, coords['x']-1] for _, coords in df.iterrows()]

Если вам нужна эффективность, используйте df.itertuples ( )

0
Vladimir Kulyashov 15 Фев 2021 в 12:43
66207184