Есть ли способ распределить отсортированные значения в кадре данных по группам на основе чередующихся элементов - PullRequest
2 голосов
/ 06 августа 2020

У меня есть Pandas DataFrame, например:

COURSE  BIB#  COURSE 1  COURSE 2  STRAIGHT-GLIDING     MEAN  PRESTASJON
1          2    20.220    22.535             19.91  21.3775    1.073707
0          1    21.235    23.345             20.69  22.2900    1.077332

Это от пилотного проекта, и DataFrame может быть намного длиннее, когда мы проводим настоящий эксперимент. Теперь, когда я рассчитал производительность для каждого номера BIB #, я хочу разделить их на две разные группы в зависимости от их производительности. Поэтому я написал следующий код:

df1 = df1.sort_values(by='PRESTASJON', ascending=True)

Это сортирует значения в DataFrame. Теперь я хочу назначить четные строки одной группе, а нечетные - другой. Как я могу это сделать?

Я понятия не имею, что ищу. Я искал в документации модуль random в Python, но это не совсем то, что я ищу. Я видел несколько вопросов / сообщений, указывающих на функцию стратификации scikit-learn, но я не знаю, хороший ли это выбор. В качестве альтернативы, есть ли способ создать al oop, который выполняет это? Я ценю вашу помощь.

Вот цифра для иллюстрации того, чего я хочу достичь sh

Чего я хочу достичь sh

Ответы [ 2 ]

3 голосов
/ 06 августа 2020

Как насчет этого:

threshold = 0.5
df1['group'] = df1['PRESTASJON'] > threshold

Или, если вам нужны значения для ваших групп:

df['group'] = np.where(df['PRESTASJON'] > threshold, 'A', 'B')

Здесь 'A' будет присвоено столбцу 'group', если точность соответствует наш порог, иначе 'B'.

ОБНОВЛЕНИЕ : за обновление OP в сообщении, если вы хотите сгруппировать их поочередно в две группы:

#sort your dataframe based on precision column
df1 = df1.sort_values(by='PRESTASJON')
#create new column with default value 'A' and assign even rows (alternative rows) to 'B'
df1['group'] = 'A'
df1.iloc[1::2,-1] = 'B'
2 голосов
/ 06 августа 2020

Вы попеременно разделяете фрейм данных? В таком случае можно:

df1 = df1.sort_values(by='PRESTASJON', ascending=True)

for i,d in df1.groupby(np.arange(len(df1)) %2):
    print(f'group {i}')
    print(d)

Другой способ без groupby:

df1 = df1.sort_values(by='PRESTASJON', ascending=True)
mask = np.arange(len(df1)) %2

group1 = df1.loc[mask==0]

group2 = df1.loc[mask==1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...