Получите верхние N значений из каждой строки кадра данных Pandas с соответствующими именами столбцов - PullRequest
2 голосов
/ 03 августа 2020
Index          Class 1               Class 2         Class 3         Class 4          Class 5  
0              0.95693475            0.252198994      0.0            0.335894585      0.611441553
1              0.473615974           0.0              0.510585248    0.5007305        0.975620011
2              0.224682823           0.122315248      0.6407305        0.0            0.872211390

Это образец фрейма данных, над которым я работаю. У меня есть около 200 Class's в моем исходном фрейме данных и около 85000 строк, и для каждой строки моего фрейма данных я хочу найти 3 верхних категории с их значениями, отсортированными в порядке убывания:

    Expected output:
    Row 0: [{Class 1 : 95693475}, {Class 5: 0.611441553}, {Class 4: 0.335894585}]
    Row 1: [{Class 5 : 0.975620011}, {Class 3: 0.510585248}, {Class 4: 0.5007305}]
etc etc...

Примечание: список и dict в ожидаемом выводе просто добавлены для справки, просто нужно вывести первые 3 оценки с их названиями категорий для каждой строки в кадре данных. Кто-нибудь может мне с этим помочь

1 Ответ

2 голосов
/ 03 августа 2020

Ссылки:

Применить функцию к строке в pandas - Пример 3

Вернуть первые n пар ключевых значений из dict

Чтобы вернуть первые n пар ключевых значений из dict

from itertools import islice
def take(n, iterable):
    return list(islice(iterable, n))

отбросьте столбец индекса

df.drop('Index', axis=1,inplace=True)

Функция, которую можно применить ко всем строкам для поиска 3 самые верхние категории

Функция topN принимает в качестве входного параметра row: строку фрейма данных и n: обозначает, сколько самых верхних элементов вы хотите извлечь.

def topN(row, n):
    x = row.to_dict() # convert the input row to a dictionary 
    x = {k: v for k, v in sorted(x.items(), key=lambda item: -item[1])} # sort the dictionary based on their values 
    n_items = take(n, x.items()) # extract the first n values from the dictionary 
    return n_items
n = 3 #number of elements needed
df['X'] = df.apply(lambda row : topN(row,n), axis = 1) 

Вывод:

Новый столбец X с требуемым результатом в виде словарей. Вы также можете преобразовать столбец в массив.

Class 1 Class 2 Class 3 Class 4 Class 5 X
0   0.956935    0.252199    0.000000    0.335895    0.611442    [(Class 1, 0.95693475), (Class 5 , 0.61144155...
1   0.473616    0.000000    0.510585    0.500731    0.975620    [(Class 5 , 0.975620011), (Class 3, 0.5105852...
2   0.224683    0.122315    0.640730    0.000000    0.872211    [(Class 5 , 0.87221139), (Class 3, 0.6407305)...

Пример удаления всех значений с помощью 0.0:

d = {1:0.0, 2:0.0, 3:1.0}
x={k:v for k,v in d.items() if v}
x # prints {3: 1.0}
...