Изменение формы / трансформации кадра данных Pandas из поворотной таблицы

1

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

Изображение 174551

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

Изображение 174551

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

Теги:
pandas

3 ответа

0

Сначала получите 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
0

Вы можете использовать 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
  • 0
    Привет, @nixon, спасибо за предложение, но вместо того, чтобы жестко кодировать слово «Item», был бы способ получить исходное имя столбца, например «Item1», «Item4» ... и передать его в качестве значения столбцов «Рекомендации». вместо индекса столбца, как это происходит с вашими результатами df.applymap (lambda x: 'Item' + str (x))?
  • 0
    Хорошо @ user3116949 на самом деле оказалось гораздо проще изменить его под ваше предложение :)
Показать ещё 1 комментарий
-2
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
    Нужен индекс рекомендации, а не значение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню