我有一个数据透视图,其中包含客户建议,如下所示:
我想重塑此数据框或形成另一个新数据框,其中包含 CustomerID 列和4个新的附加列,分别称为'Recommendation#1','Recommendation#2','Recommendation#3'和“ Recommendation#4” (推荐#4),其中每个列的每个客户评分最高的4个项目。我正在尝试使其看起来像这样:
但是,我对于如何在python中从已透视的数据帧中获取所需的数据帧有点迷茫。有关如何解决此问题的任何帮助或建议,将不胜感激!
答案 0 :(得分:2)
您可以使用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
答案 1 :(得分:0)
首先获取数据帧values
,然后用numpy.sort
对其进行排序,颠倒顺序并获得前四个条目。然后将此数据设置为新的数据框:
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
答案 2 :(得分:-1)
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]