У меня есть сводный DataFrame с рекомендациями клиентов, которые выглядят следующим образом:
Я хочу изменить эту фреймворк данных или сформировать еще один новый фреймворк, содержащий столбец CustomerID и 4 новых дополнительных столбца, называемых "Рекомендация № 1", "Рекомендация № 2", "Рекомендация № 3" и "Рекомендация № 4", где каждый столбец будет иметь топ 4 наивысших набранных предметов для каждого клиента. Я пытаюсь сделать это примерно так:
Однако я немного теряюсь в том, как подойти к этому в python, чтобы получить требуемый фрейм данных из моего поворотного фрейма. Любая помощь или предложения о том, как подойти к этому, будут очень благодарны!
Сначала получите values
numpy.sort
, затем отсортируйте их с помощью numpy.sort
, 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
Вы можете использовать argsort
и сохранять самые высокие n
элементов в каждой строке:
n=4
data = df.values.argsort().T[::-1].T[:,:n]
И постройте dataframe из полученного массива и указанные вами столбцы:
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
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]