Панды: добавление нового столбца со случайными числами в DF на основе нескольких критериев из строки - PullRequest
0 голосов
/ 18 сентября 2018

Я новичок. Я просмотрел и прочитал несколько связанных вопросов, но не могу понять это. Я знаю, что я проблема, и что я что-то упускаю, но я надеюсь, что кто-то будет добрым и поможет мне. Я пытаюсь преобразовать данные из одной видеоигры (симуляция баскетбола в колледже) в данные, соответствующие формату другой видеоигры (симуляция баскетбола).

У меня есть DF, который имеет столбцы: Имя, Поз, Рост, Вес, Выстрел, Очки

С такими значениями, как: Джон Смит, С, 84, 235, отл, 19,4 Грег Джонс, PG, 72, 187, Fair, 12,0

Я хочу создать новый столбец для "InsideScoring". То, что я хотел бы сделать, это назначить игроку случайно сгенерированное число в пределах определенного диапазона, основываясь на том, какую позицию он сыграл, рост, вес, рейтинг выстрела и набранные очки.

Я попробовал несколько попыток, таких как:

df1['InsideScoring'] = 0
df1.loc[(df1.Pos == "C") &
        (df1.Height > 82) &
        (df1.Points > 19.0) &
        (df1.Weight > 229), 'InsideScoring'] = np.random.randint(85,100)

Когда я делаю это, всем игрокам (строка в столбце «InsideScoring»), которые соответствуют критериям, присваивается одинаковое значение от 85 до 100, а не случайное сочетание чисел от 85 до 100.

В конце концов, я хочу просмотреть список игроков и, основываясь на этих четырех критериях, назначить значения из разных диапазонов. Любые идеи приветствуются.

Панды: Создать новый столбец со случайными значениями на основе условных

Numpy "где" с несколькими условиями

1 Ответ

0 голосов
/ 18 сентября 2018

Рекомендую использовать здесь np.select.Вы устанавливаете свои условия, свои результаты, и вы готовы к работе.Однако, чтобы избежать итерации, но также , чтобы избежать присвоения одинакового случайного значения каждому столбцу, который удовлетворяет условию, создайте случайные значения, равные длине вашего DataFrame, и выберите из них:


Настройка

df = pd.DataFrame({
    'Name': ['Chris', 'John'],
    'Height': [72, 84],
    'Pos': ['PG', 'C'],
    'Weight': [165, 235], 
    'Shot': ['Amazing', 'Fair'],
    'Points': [999, 25]
})

    Name  Height Pos  Weight     Shot  Points
0  Chris      72  PG     165  Amazing     999
1   John      84   C     235     Fair      25

Теперь настройте диапазоны и свои условия (создайте столько, сколько вам нужно):

cond1 = df.Pos.eq('C') & df.Height.gt(80) & df.Weight.gt(200)
cond2 = df.Pos.eq('PG') & df.Height.lt(80) & df.Weight.lt(200)

range1 = np.random.randint(85, 100, len(df))
range2 = np.random.randint(50, 85, len(df))

df.assign(InsideScoring=np.select([cond1, cond2], [range1, range2]))

    Name  Height Pos  Weight     Shot  Points  InsideScoring
0  Chris      72  PG     165  Amazing     999             72
1   John      84   C     235     Fair      25             89

Теперь, чтобы убедиться, что это не присваивает значения более одного раза:

df = pd.concat([df]*5)

... # Setup the ranges and conditions again

df.assign(InsideScoring=np.select([cond1, cond2], [range1, range2]))

    Name  Height Pos  Weight     Shot  Points  InsideScoring
0  Chris      72  PG     165  Amazing     999             56
1   John      84   C     235     Fair      25             96
0  Chris      72  PG     165  Amazing     999             74
1   John      84   C     235     Fair      25             93
0  Chris      72  PG     165  Amazing     999             63
1   John      84   C     235     Fair      25             97
0  Chris      72  PG     165  Amazing     999             55
1   John      84   C     235     Fair      25             95
0  Chris      72  PG     165  Amazing     999             60
1   John      84   C     235     Fair      25             90

И мы можемубедитесь, что случайные значения назначены, хотя все они соответствуют одному из двух условий.Хотя это менее эффективно для использования памяти, чем итерация и выбор случайного значения, поскольку мы создаем много неиспользуемых чисел, оно все равно будет быстрее, поскольку это векторизованные операции.

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