![](/img/trans.png)
[英]How to use pandas to create columns from one with pivot_table
[英]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.