Изменение формы / трансформации кадра данных Pandas из поворотной таблицы - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть сводный фрейм данных с рекомендациями клиентов, который выглядит следующим образом:

enter image description here

Я хочу изменить этот фрейм данных или сформировать другой новый фрейм данных, содержащий CustomerID столбец и 4 новых дополнительных столбца, которые называются «Рекомендация № 1», «Рекомендация № 2», «Рекомендация № 3» и «Рекомендация № 4» , где каждый столбец будет иметь4 лучших пункта с наибольшим количеством очков для каждого клиента.Я пытаюсь сделать так, чтобы это выглядело примерно так:

enter image description here

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

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018
import pandas as pd
import numpy as np
df = pd.DataFrame({'CustomerID':['ID1','ID2','ID3'],
                   'Item1':[0,5,0],
                   'Item2':[5,0,0],
                   'Item3':[1.2,0,3],
                   'Item4':[5,4,0],
                   'Item5':[2,5,0],
                   'Item6':[3,3,5],
                   'Item7':[0,0,5],
                   'Item8':[3,0,4]})

df.set_index('CustomerID', inplace=True)
df = df * -1
df2 = df.apply(np.sort, axis=1)
df2 = abs(df2)

Выход

    CustomerID
ID1    [5.0, 5.0, 3.0, 3.0, 2.0, 1.2, 0.0, 0.0]
ID2    [5.0, 5.0, 4.0, 3.0, 0.0, 0.0, 0.0, 0.0]
ID3    [5.0, 5.0, 4.0, 3.0, 0.0, 0.0, 0.0, 0.0]
0 голосов
/ 05 декабря 2018

Вы можете использовать argsort и сохранять самые высокие элементы n в каждой строке:

n=4
data = df.values.argsort().T[::-1].T[:,:n] 

И строить кадр данных из полученного массива и указанных вами столбцов.:

columns = ['Recommendation#{}'.format(i) for i in range(1,data.shape[1]+1)]
df = pd.DataFrame(df.columns[data], columns=columns, index = df.index) 
print(df)

         Recommendation#1 Recommendation#2 Recommendation#3 Recommendation#4
ID1            Item4            Item2            Item8            Item6
ID2            Item5            Item1            Item4            Item6
ID3            Item7            Item6            Item8            Item3
0 голосов
/ 05 декабря 2018

Сначала получите фрейм данных values, затем отсортируйте их с помощью numpy.sort, измените порядок в обратном порядке и получите 4 первые записи.Затем установите эти данные в новый фрейм данных:

import pandas as pd

d = {'I1':[0,5,0],'I2':[5,0,0],'I3':[1.2,0,3],'I4':[5,4,0],'I5':[2,5,0],'I6':[3,3,5],'I7':[0,0,5],'I8':[3,0,4]}

df = pd.DataFrame(d)
print(df)
#    I1  I2   I3  I4  I5  I6  I7  I8
# 0   0   5  1.2   5   2   3   0   3
# 1   5   0  0.0   4   5   3   0   0
# 2   0   0  3.0   0   0   5   5   4
a = df.values
a = a.argsort(axis=1)
a = a[:,::-1][:,:4]+1
df2 = pd.DataFrame(columns=['Rec1', 'Rec2', 'Rec3', 'Rec4'], data=a)
df2[list(df2)] = 'I' + df2[list(df2)].astype(str)
print(df2)
#   Rec1 Rec2 Rec3 Rec4
# 0   I4   I2   I8   I6
# 1   I5   I1   I4   I6
# 2   I7   I6   I8   I3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...