Рандомизация строк во фрейме данных, чтобы одно и то же значение не повторялось дважды подряд - PullRequest
0 голосов
/ 31 января 2020

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

Я хочу добиться очень простой вещи: перетасовать строки этого фрейма данных, но с ограничением, что числа в ' Столбец «Идентичность» никогда не появляется дважды подряд (например, если бы у нас была последовательность 112233, это было бы приемлемым тасованием: 123123, но это не будет: 12 33 21, потому что появляются два числа 3 подряд).

Моя «самая успешная» попытка на данный момент заключается в следующем:

def shuffling(x):    
    spreadsheetEmpty = pd.DataFrame(columns=['NeutralImage', 'EmotionalImage', 'Group', 'Condition', 'Emotion', 'Identity', 'Gender', 'trigger']) #Create an empty data frame - same columns as the original
    for index in range(0,len(x)-1): 
        while x['Identity'].iloc[index] == x['Identity'].iloc[index+1]: #if the identity in that row is the same as in the next one, shuffle again
            x = x.sample(frac=1).reset_index(drop=True 
        else: #If we don't have two identities right next to each other:
            spreadsheet_final = spreadsheetEmpty.append(x) #Fill in the empty spreadsheet from the beginning with a pseudorandomized one
            return(spreadsheet_final)

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

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

Заранее спасибо!

Изображение фрейма данных

1 Ответ

0 голосов
/ 03 февраля 2020

Тем временем мне удалось решить эту проблему, поэтому успешная функция теперь выглядит следующим образом:

def shuffling(x):    
#Create an empty data frame
    spreadsheetEmpty = pd.DataFrame(columns=['NeutralImage', 'EmotionalImage', 'Group', 'Condition', 'Emotion', 'Identity', 'Gender', 'trigger', 'FixCrossColor1', 'FixCrossColor2','Combination'])
    xshuffle = x.sample(frac=1).reset_index(drop=True) #Shuffle rows for the first time
    while any(xshuffle['Identity'].iloc[label] == xshuffle['Identity'].iloc[label+1] for label in range(0,len(xshuffle)-1)): #if identity value repeats twice in succession anywhere in the dataframe, shuffle again
        xshuffle = x.sample(frac=1).reset_index(drop=True)
    else: #If we don't have two identities right next to each other, fill in the empty spreadsheet
        spreadsheet_final = spreadsheetEmpty.append(xshuffle) 
        print(spreadsheet_final)
                                                                           
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...