Обмен значениями в первом столбце на основе значений в другом столбце - PullRequest
1 голос
/ 15 апреля 2020

У меня есть датафрейм с четырьмя столбцами. Первый столбец представляет Предмет, каждый Предмет непрерывно повторяется 60 раз в столбце. Всего есть 54 предмета. Второй столбец представляет блок. Каждый субъект прошел более 6 блоков, начиная с 1-го и заканчивая 6-м. Третий столбец - Имя. Каждый Блок содержал 10 Имен, которые были выбраны случайным образом из 20 возможных Имен. Четвертый столбец представляет Серийный номер Имени. Таким образом, каждый блок содержит серийный номер от 1 до 10 и соответствующее случайно назначенное имя. Проблема в том, что имена были присвоены неправильно их серийному номеру.

То, что я хочу, это поменять (изменить позицию) имена на основе соответствующего серийного номера. Таким образом, Name under Serial Number 1 будет swapped with Name with the Serial Number 6 (pattern: 1=6, 2=7, 3=8, 4=9, 5=10). Серийный номер остается без изменений, но последовательность Имени должна быть изменена. Я хочу, чтобы это для каждого блока для каждого субъекта. У меня есть код, который делает правильные вещи, но проблема в том, что он работает только для первого субъекта:

 df['Name'] = (df.assign(blk_5 = (np.arange(len(df))//5+1) % 2,
                 blk_10 = np.arange(len(df)) // 10
                )
         .sort_values(['Block','blk_10','blk_5'])
         ['Name'].values
      )

Я пытался с groupby, чтобы сгруппировать столбец Subject и назначить функцию для каждого субъекта , но безуспешно.

def function_test(df):  
df['Name'] = (df.assign(blk_5 = (np.arange(len(df))//5+1) % 2,
                     blk_10 = np.arange(len(df)) // 10
                    )
             .sort_values(['Block','blk_10','blk_5'])
             ['Name'].values
          )

......
    grouped = df.groupby('Subject')
    print(grouped.transform(function_test))
...
Retrurns: AttributeError: 'Series' object has no attribute 'assign'

Еще одна вещь, которую я попробовал:

test = df.groupby(['Subject', 'Block']).apply(function_test)

, которая ничего не делает!

Есть предложения? Большое спасибо!

1 Ответ

1 голос
/ 15 апреля 2020

IIU C использование:

def function_test(x):  
    x['Name'] = (x.assign(blk_5 = (np.arange(len(x))//5+1) % 2,
                                   blk_10 = np.arange(len(x)) // 10
                    )
                  .sort_values(['Block','blk_10','blk_5'])
                   ['Name'].values
          )
    return x

df = df.groupby('Subject').apply(function_test)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...