Python - рандомизировать значение для данного ключа, а затем снова рандомизировать, если есть какие-либо повторяющиеся ключи - PullRequest
0 голосов
/ 20 июня 2020

Я использую следующий набор случайных значений:

dict_positionxy = {'a difficult anglethe left':{'y':random.randrange(43,54), 'x':random.randrange(0,6)},
                   'a difficult anglethe right':{'y':random.randrange(14,25), 'x':random.randrange(0,6)},
                   'long rangeN/A': {'y':random.randrange(0,68), 'x':random.randrange(40,52)},
                   'long rangethe centre':{'y':random.randrange(0,68), 'x':random.randrange(28,40)},
                   'long rangethe left': {'y':random.randrange(54,68), 'x':random.randrange(0,24)},
                   'long rangethe right':{'y':random.randrange(0,14), 'x':random.randrange(0,24)},
                   'outside the boxN/A':{'y':random.randrange(14,54), 'x':random.randrange(16,28)},
                   'penaltyN/A':{'y':random.randrange(36), 'x':random.randrange(8)},
                   'the boxthe centre':{'y':random.randrange(25,45), 'x':random.randrange(0,6)},
                   'the boxthe left':{'y':random.randrange(41,54), 'x':random.randrange(0,16)},
                   'the boxthe right':{'y':random.randrange(14,22), 'x':random.randrange(0,16)},
                   'the six yard boxthe left': {'y':random.randrange(33,43), 'x':random.randrange(4,6)},
                   'the six yard boxthe right':{'y':random.randrange(25,33), 'x':random.randrange(4,6)},
                   'very close rangeN/A':{'y':random.randrange(25,43), 'x':random.randrange(0,4)}}

, чтобы заполнить значения сетки X / Y, например:

df_temp_shots['PositionXY'] = df_temp_shots['Position'].map(dict_positionxy)

Проблема в том, что некоторые ключи событий будут повторяться.

Например, если две цели имеют один и тот же ключ 'the boxthe left', они получат одинаковое значение, что нежелательно, потому что они будут нанесены на график на том же месте.

Итак, как мне снова рандомизировать любые повторяющиеся значения, всегда заканчивая уникальными значениями в желаемом диапазоне для каждого ключа?

Ответы [ 2 ]

2 голосов
/ 21 июня 2020

Модифицированное решение, не использующее eval:

df = pd.DataFrame({'Position': ['A', 'A']})

dict_position = {'A': [[40, 60], [80, 90]]}

def dict_pos_xy(pos):
    return {'y':np.random.randint(pos[0][0], pos[0][1]), \
            'x':np.random.randint(pos[1][0], pos[1][1])}

df.Position.apply(lambda x: dict_pos_xy(dict_position.get(x)))
2 голосов
/ 21 июня 2020

Остерегайтесь: в этом ответе используется eval

Вместо этого вы можете попробовать использовать .apply. Таким образом, он будет перебирать все строки и применять разные значения random. В этом решении я использовал eval() для оценки выражений при вызове значения, хранящегося в dict. Обратите внимание, что теперь значения хранятся в виде строк.

# sample dataframe
df = pd.DataFrame({'Position': ['A', 'A']})

dict_position = {'A': "{'x': np.random.randint(40, 60), 'y': np.random.randint(40, 60)}"}
df.Position.apply(lambda x: eval(dict_position.get(x)))

Что дает следующий результат:

    Position
0   {'x': 43, 'y': 51}
1   {'x': 48, 'y': 49}

Другими способами могут быть определение функции или перечисление всех ваших условий непосредственно в лямбда-функции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...