Группировка данных вместе на основе заданного приращения c - PullRequest
0 голосов
/ 28 марта 2020

У меня есть 2D-список в python, например:

[['Xzavier Kaska', 1.04], ['Brent Barnaby', 1.13], ['Alena Holoien', 1.37], 
 ['Sam Surey', 1.37], ['Kash Nocella', 1.55], ['Ezequiel Gerraughty', 1.57], 
 ['Myah Linsley', 1.74], ['Jaelynn Dzur', 1.79], ['Alfredo Andrew', 1.83], 
 ['Skylar Movius', 1.95], ['Raphael Nocella', 2.14], ['Alondra Wallace', 2.2],
 ['Clark Loomis', 2.3], ['Skylar Cvek', 2.36], ['Carson Racugno', 2.52], 
 ['Kathy Viveros-aguilera', 2.62], ['Heaven Barnaby', 2.75], 
 ['Rebekah\tSpartichino', 3.24], ['Semaj Abernathy', 3.35], ['Rylee Dalton', 3.38], 
 ['Sterling Grove', 3.46], ['Rebekah Ghosh', 3.85]]

, где индекс 0 представляет имя студента, а индекс 1 представляет gpa каждого студента.

Я хочу сгруппировать две пары вместе в вышеупомянутых данных, основанных на приращениях в gpa. Пример: сгруппируйте их с шагом 1,0 ... учащиеся, у которых gpa 0.0-1.0 объединены вместе, например, [0.0-0.1), [0.1-0.2), ...[3.9-4.0]; [0.0-0.5],[0.5-1.0),...[3.5-4]; [0-1),[1,2),[2,3),[3,4).

Ответы [ 3 ]

1 голос
/ 28 марта 2020

Вы можете использовать pandas, это библиотека, используемая учеными в python. В Интернете есть масса поддержки, поэтому вы никогда не застрянете.

Для вашей конкретной проблемы:

import pandas as pd

l = [['Xzavier Kaska', 1.04], ['Brent Barnaby', 1.13], ['Alena Holoien', 1.37], 
 ['Sam Surey', 1.37], ['Kash Nocella', 1.55], ['Ezequiel Gerraughty', 1.57], 
 ['Myah Linsley', 1.74], ['Jaelynn Dzur', 1.79], ['Alfredo Andrew', 1.83], 
 ['Skylar Movius', 1.95], ['Raphael Nocella', 2.14], ['Alondra Wallace', 2.2],
 ['Clark Loomis', 2.3], ['Skylar Cvek', 2.36], ['Carson Racugno', 2.52], 
 ['Kathy Viveros-aguilera', 2.62], ['Heaven Barnaby', 2.75], 
 ['Rebekah\tSpartichino', 3.24], ['Semaj Abernathy', 3.35], ['Rylee Dalton', 3.38], 
 ['Sterling Grove', 3.46], ['Rebekah Ghosh', 3.85]]

# Create a dataframe with your data.
df = pd.DataFrame(l, columns=['Name','GPA'])
# select the portion of dataframe in which the GPA is between 1 and 2
# (you can set your own parameters here)
df2 = df.loc[(df['GPA'] > 1) & (df['GPA'] < 2)]

ВЫХОД:

Name    GPA
0   Xzavier Kaska   1.04
1   Brent Barnaby   1.13
2   Alena Holoien   1.37
3   Sam Surey   1.37
4   Kash Nocella    1.55
5   Ezequiel Gerraughty     1.57
6   Myah Linsley    1.74
7   Jaelynn Dzur    1.79
8   Alfredo Andrew  1.83
9   Skylar Movius   1.95

Если вы хотите вернуть список, подобный тому, который у вас есть:

list_1to2 = list(df2['Name'])
list_1to2.append('1-2')
print(list_1to2)
#repeat for each group...

ВЫХОД:

['Xzavier Kaska', 'Brent Barnaby', 'Alena Holoien', 'Sam Surey', 'Kash Nocella', 'Ezequiel Gerraughty', 'Myah Linsley', 'Jaelynn Dzur', 'Alfredo Andrew', 'Skylar Movius', '1-2']
0 голосов
/ 28 марта 2020

Я предлагаю вам использовать Pandas для группировки и манипулирования данными:

import pandas as pd
step = 0.5
df = pd.DataFrame(gpas, columns=['name', 'gpa'])
df['group'] = df['gpa'].apply(lambda x:int(float(x) // step))

После этого вы можете создавать ярлыки вашей группы:

df['group_label'] = df['group'].apply(lambda x:'{}-{}'.format(x*step, (x+1)*step))

Результат выглядит так:

df.head()

name    gpa group   group_label
0   Xzavier Kaska   1.04    2   1.0-1.5
1   Brent Barnaby   1.13    2   1.0-1.5
2   Alena Holoien   1.37    2   1.0-1.5
3   Sam Surey   1.37    2   1.0-1.5
4   Kash Nocella    1.55    3   1.5-2.0
0 голосов
/ 28 марта 2020

Вы можете создать словарь и установить ключ в качестве диапазона, например, если вы хотите, чтобы диапазон 0-1, ключ dict был 1, диапазон 4-5, ключ dict будет 5 et c. Таким образом, мы можем создать функцию, которая будет группировать студентов с определенной скоростью:

import math

l = [['Xzavier Kaska', 1.04], ['Brent Barnaby', 1.13], ['Alena Holoien', 1.37],
['Sam Surey', 1.37], ['Kash Nocella', 1.55], ['Ezequiel Gerraughty', 1.57], 
['Myah Linsley', 1.74], ['Jaelynn Dzur', 1.79], ['Alfredo Andrew', 1.83], 
['Skylar Movius', 1.95], ['Raphael Nocella', 2.14], ['Alondra Wallace', 2.2],
['Clark Loomis', 2.3], ['Skylar Cvek', 2.36], ['Carson Racugno', 2.52], 
['Kathy Viveros-aguilera', 2.62], ['Heaven Barnaby', 2.75], 
['Rebekah\tSpartichino', 3.24], ['Semaj Abernathy', 3.35], ['Rylee Dalton', 3.38], 
['Sterling Grove', 3.46], ['Rebekah Ghosh', 3.85]]

def group(l : list):
   """
   Group list students by their gpa with pace 1
   :param l: input list of students and gpa's
   :return: dictionary, where key is range: (key-1, key)
   ex. if you want to get list of students with gpa 1 :  d[1]
   """

   d = {}
   i = 0
   for student, gpa in l:
       index = math.ceil(gpa) - 1
       if index < 1: index = 1
       if index not in d.keys():
           d[index] = [[student, gpa]]
       else:
           d[index].append([student, gpa])
       i += 1

   return d

d = group(l)

# checking:

for i in group(l):
   print(f'range : {i-1} to {i}, list : {d[i]}')

# output will be:
# range : 0 to 1, list : [['Xzavier Kaska', 1.04], ['Brent Barnaby', 1.13], ['Alena Holoien', 1.37], ['Sam Surey', 1.37], ['Kash Nocella', 1.55], ['Ezequiel Gerraughty', 1.57], ['Myah Linsley', 1.74], ['Jaelynn Dzur', 1.79], ['Alfredo Andrew', 1.83], ['Skylar Movius', 1.95]]
# range : 1 to 2, list : [['Raphael Nocella', 2.14], ['Alondra Wallace', 2.2], ['Clark Loomis', 2.3], ['Skylar Cvek', 2.36], ['Carson Racugno', 2.52], ['Kathy Viveros-aguilera', 2.62], ['Heaven Barnaby', 2.75]]
# range : 2 to 3, list : [['Rebekah\tSpartichino', 3.24], ['Semaj Abernathy', 3.35], ['Rylee Dalton', 3.38], ['Sterling Grove', 3.46], ['Rebekah Ghosh', 3.85]]

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

if 4 in d.keys():
    print(len(d[4]))
else:
    print('No students in such a group')
...