从数据透视表重塑/转换Pandas数据框

时间:2018-12-05 14:03:14

标签: python pandas

我有一个数据透视图,其中包含客户建议,如下所示:

enter image description here

我想重塑此数据框或形成另一个新数据框,其中包含 CustomerID 列和4个新的附加列,分别称为'Recommendation#1','Recommendation#2','Recommendation#3'和“ Recommendation#4” (推荐#4),其中每个列的每个客户评分最高的4个项目。我正在尝试使其看起来像这样:

enter image description here

但是,我对于如何在python中从已透视的数据帧中获取所需的数据帧有点迷茫。有关如何解决此问题的任何帮助或建议,将不胜感激!

3 个答案:

答案 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]