簡體   English   中英

熊貓:如何為數據集中的所有項目創建userByItem數據透視表

[英]Pandas: How to create userByItem pivot_table for all the items in the dataset

假設我有一個看起來像這樣的數據集:

User Item Rating
u1   i1   3
u2   i2   4
u3   i3   5
u4   i1   2
u5   i2   1
u5   i4   3
u1   i4   2

我將數據集分為兩部分,訓練數據集:

User Item Rating
u1   i1   3
u2   i2   4
u3   i3   5

和測試數據集:

User Item Rating
u4   i1   2
u5   i2   1
u5   i4   3
u1   i4   2

如果我使用以下代碼從這2個拆分的數據集中創建2個透視表:

 trainPivot = pd.pivot_table(trainData, values='Rating',
                                index=['User'], columns=['Item'])
 testPivot = pd.pivot_table(testData, values='Rating',
                                index=['User'], columns=['Item'])

然后,對於Train Data,生成的數據透視表將如下所示:

       I1      I2         I3
U1     3       Null       Null
U2     Null    4          Null
U3     Null    Null       5

對於測試數據:

       I1      I2    I4      
U4     2       Null  Null   
U5     Null    1     3

但是我希望我的pivot_tables看起來像這樣,對於火車數據:

       I1      I2         I3     I4
U1     3       Null       Null   Null
U2     Null    4          Null   Null
U3     Null    Null       5      Null

對於測試數據:

       I1      I2    I3    I4      
U1     Null    Null  Null  2
U4     2       Null  Null  Null   
U5     Null    1     Null  3

如何使用pivot_table方法在Pandas數據框中實現此目的。

關鍵是添加一個不存在的項目列。

我不確定Null是什么,所以我插入nan來保持默認的pandas格式。

import pandas as pd
import numpy as np


data = pd.DataFrame({
    'User': ['u1', 'u2', 'u3', 'u4', 'u5', 'u5', 'u1'],
    'Item': ['i1', 'i2', 'i3', 'i1', 'i2', 'i4', 'i4'],
    'Rating': [3, 4, 5, 2, 1, 3, 2]
})

train_data = data.head(3)
test_data = data.tail(4)

train_pivot = pd.pivot_table(
    train_data, values='Rating', index=['User'], columns=['Item']
)
test_pivot = pd.pivot_table(
    test_data, values='Rating', index=['User'], columns=['Item']
)

unique_items = data['Item'].unique()

for item in unique_items:
    if item not in test_pivot:
        test_pivot[item] = np.nan
    if item not in train_pivot:
        train_pivot[item] = np.nan

# If you want the columns sorted alphabetically
train_pivot = train_pivot.reindex_axis(sorted(train_pivot.columns), axis=1)
test_pivot = test_pivot.reindex_axis(sorted(test_pivot.columns), axis=1)

輸出結果:

train_pivot

Item   i1   i2   i3  i4
User                   
u1    3.0  NaN  NaN NaN
u2    NaN  4.0  NaN NaN
u3    NaN  NaN  5.0 NaN

test_pivot

Item   i1   i2  i3   i4
User                   
u1    NaN  NaN NaN  2.0
u4    2.0  NaN NaN  NaN
u5    NaN  1.0 NaN  3.0

您可以使用完整的索引/列清單構造一個空的外殼,然后將訓練和測試集“添加”到外殼:

shell = (data
         .pivot_table(values='Rating', index='User', columns='Item')
         .astype(str)
         .replace(".*", np.nan, regex=True))

shell
Item  i1  i2  i3  i4
User                
u1   NaN NaN NaN NaN
u2   NaN NaN NaN NaN
u3   NaN NaN NaN NaN
u4   NaN NaN NaN NaN
u5   NaN NaN NaN NaN

shell.loc[train_pivot.index].add(train_pivot, fill_value=0)
Item   i1   i2   i3  i4
User                   
u1    3.0  NaN  NaN NaN
u2    NaN  4.0  NaN NaN
u3    NaN  NaN  5.0 NaN

shell.loc[test_pivot.index].add(test_pivot, fill_value=0)
Item   i1   i2  i3   i4
User                   
u1    NaN  NaN NaN  2.0
u4    2.0  NaN NaN  NaN
u5    NaN  1.0 NaN  3.0

注意:使用data從@Arda阿爾斯蘭的構建很好的例子。

data = pd.DataFrame({
    'User': ['u1', 'u2', 'u3', 'u4', 'u5', 'u5', 'u1'],
    'Item': ['i1', 'i2', 'i3', 'i1', 'i2', 'i4', 'i4'],
    'Rating': [3, 4, 5, 2, 1, 3, 2]
})
train_data = data.head(3)
test_data = data.tail(4)
train_pivot = pd.pivot_table(train_data, values='Rating', index=['User'], columns=['Item'])
test_pivot = pd.pivot_table(test_data, values='Rating', index=['User'], columns=['Item'])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM