У меня есть такие данные:
| | name | time | electoral_not | government_not | political_participation_not | cultur_not | civil_not |
|---|-----------|------|---------------|----------------|-----------------------------|------------|-----------|
| 0 | Iceland | 2018 | 163 | 162 | 165 | 166 | 161 |
| 1 | Norway | 2018 | 160 | 165 | 166 | 164 | 159 |
| 2 | Australia | 2018 | 166 | 158 | 153 | 160 | 166 |
Я хочу оценить эти данные от 1 до 5 для каждой строки:
| | name | time | electoral_not | government_not | political_participation_not | cultur_not | civil_not |
|---|-----------|------|---------------|----------------|-----------------------------|------------|-----------|
| 0 | Iceland | 2018 | 3 | 2 | 4 | 5 | 1 |
| 1 | Norway | 2018 | 2 | 4 | 5 | 3 | 1 |
| 2 | Australia | 2018 | 4.5 | 2 | 1 | 3 | 4.5 |
Если в одном и том же значении содержится более одного значенияподряд они должны быть усреднены. Пример для Австралии Ценности:166 158 153 160 166
Сортировка:153 158 160 166 166
Scrore_table:1 2 3 4 5
Результат:
| 4 | 2 | 1 | 3 | 5 |
|---------|---|---|---|---------|
| (4+5)/2 | 2 | 1 | 3 | (5+4)/2 |
| 4.5 | 2 | 1 | 3 | 4.5 |
Я только сделал это:
def fun(x):
row = list(x[2:7])
x[2:7] = find_note(row)
return x
def find_note(row):
ranked = row.copy()
ranked.sort()
row = deque(row)
note=[]
while row:
value = row.popleft()
for i in range(5):
if value==ranked[i]:
note.append(i+1)
break
return note
x = combined.apply(lambda x: fun(x), axis=1)[['name','time','electoral_not','government_not','political_participation_not','cultur_not','civil_not']]
и результат:
| name | time | electoral_not | government_not | political_participation_not | cultur_not | civil_not | |
|------|-----------|---------------|----------------|-----------------------------|------------|-----------|---|
| 0 | Iceland | 2018 | 3 | 2 | 4 | 5 | 1 |
| 1 | Norway | 2018 | 2 | 4 | 5 | 3 | 1 |
| 2 | Australia | 2018 | 4 | 2 | 1 | 3 | 4 |
| 3 | Denmark | 2018 | 5 | 4 | 2 | 3 | 1 |