Python 创建矩阵时列索引超出范围
我目前正在创建dok矩阵(不了解灵敏度矩阵)这是必需的)。首先,我删除所有购买少于2件物品的用户。然后我将数据帧分成测试和训练两部分,各占0.1% 现在我把它放到矩阵中,不幸的是,我得到一个错误,它是indexer:column index(98)超出范围 如何删除此错误? 数据帧Python 创建矩阵时列索引超出范围,python,arrays,pandas,dataframe,Python,Arrays,Pandas,Dataframe,我目前正在创建dok矩阵(不了解灵敏度矩阵)这是必需的)。首先,我删除所有购买少于2件物品的用户。然后我将数据帧分成测试和训练两部分,各占0.1% 现在我把它放到矩阵中,不幸的是,我得到一个错误,它是indexer:column index(98)超出范围 如何删除此错误? 数据帧 import numpy as np import pandas as pd import scipy.sparse as sp d = {'userid': [0, 0, 0, 1, 2, 2, 3, 3,
import numpy as np
import pandas as pd
import scipy.sparse as sp
d = {'userid': [0, 0, 0, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 5, 5, 5],
'itemid': [715, 845, 98, 12324, 85, 715, 2112, 85, 2112, 852, 102, 85, 2112, 852, 98, 652]}
df = pd.DataFrame(data=d)
print(df)
方法
def remove_purchase_cleanded(df, value):
return df[df['userid'].map(df['userid'].value_counts()) > value].reset_index(drop=True)
df_new = remove_purchase_cleanded(df, 2)
print(df_new)
def splitter(df, split):
indices = np.random.permutation(len(df))
test_size = int(len(df) * split)
test_indices = indices[:test_size]
train_indices = indices[test_size:]
return df.iloc[train_indices], df.iloc[test_indices]
def generate_matrix(df_main, dataframe):
mat = sp.dok_matrix((df_main.shape[0], len(df_main['itemid'].unique())), dtype=np.float32)
for userid, itemid in zip(dataframe['userid'], dataframe['itemid']):
mat[userid, itemid] = 1.0 # here is the error
方法的调用
train, test = splitter(df_new, 0.1)
train = train.sort_values(by=['userid']).reset_index(drop=True)
test = test.sort_values(by=['userid']).reset_index(drop=True)
print(train)
print(test)
train_mat = generate_matrix(df_new, train) # here is the error
test_mat = generate_matrix(df_new, test)
# The error
IndexError: column index (98) out of range
完整数据帧
userid itemid
0 0 715
1 0 845
2 0 98
3 1 12324
4 2 85
5 2 715
6 3 2112
7 3 85
8 4 2112
9 4 852
10 4 102
11 5 85
12 5 2112
13 5 852
14 5 98
15 5 652
userid itemid
0 0 715
1 0 845
2 0 98
3 4 2112
4 4 852
5 4 102
6 5 85
7 5 2112
8 5 852
9 5 98
10 5 652
userid itemid
0 0 845
1 0 715
2 4 102
3 4 2112
4 4 852
5 5 98
6 5 2112
7 5 85
8 5 852
userid itemid
0 0 98
删除的数据帧
userid itemid
0 0 715
1 0 845
2 0 98
3 1 12324
4 2 85
5 2 715
6 3 2112
7 3 85
8 4 2112
9 4 852
10 4 102
11 5 85
12 5 2112
13 5 852
14 5 98
15 5 652
userid itemid
0 0 715
1 0 845
2 0 98
3 4 2112
4 4 852
5 4 102
6 5 85
7 5 2112
8 5 852
9 5 98
10 5 652
userid itemid
0 0 845
1 0 715
2 4 102
3 4 2112
4 4 852
5 5 98
6 5 2112
7 5 85
8 5 852
userid itemid
0 0 98
列车数据帧
userid itemid
0 0 715
1 0 845
2 0 98
3 1 12324
4 2 85
5 2 715
6 3 2112
7 3 85
8 4 2112
9 4 852
10 4 102
11 5 85
12 5 2112
13 5 852
14 5 98
15 5 652
userid itemid
0 0 715
1 0 845
2 0 98
3 4 2112
4 4 852
5 4 102
6 5 85
7 5 2112
8 5 852
9 5 98
10 5 652
userid itemid
0 0 845
1 0 715
2 4 102
3 4 2112
4 4 852
5 5 98
6 5 2112
7 5 85
8 5 852
userid itemid
0 0 98
测试数据帧
userid itemid
0 0 715
1 0 845
2 0 98
3 1 12324
4 2 85
5 2 715
6 3 2112
7 3 85
8 4 2112
9 4 852
10 4 102
11 5 85
12 5 2112
13 5 852
14 5 98
15 5 652
userid itemid
0 0 715
1 0 845
2 0 98
3 4 2112
4 4 852
5 4 102
6 5 85
7 5 2112
8 5 852
9 5 98
10 5 652
userid itemid
0 0 845
1 0 715
2 4 102
3 4 2112
4 4 852
5 5 98
6 5 2112
7 5 85
8 5 852
userid itemid
0 0 98
查看
df_main['itemid']
中的值,我看不出len(df_main['itemid'].unique())
中的列数如何工作?也许你想要更多的东西,比如df_main['itemid'].max()+1
?@Timus,真管用!谢谢,我是否也应该更改df_main.shape[0]?作为示例显示的值不需要它。但是:我真的不知道你在做什么,我只是从技术的角度来看。因此,我可能没有资格给出正确的答案:(查看df_main['itemid']
中的值,我看不出len(df_main['itemid'].unique())
中的列数如何工作?也许你想要更多的东西,比如df_main['itemid'].max()+1
?@Timus,真管用!谢谢,我是否也应该更改df_main.shape[0]?作为示例显示的值不需要它。但是:我真的不知道你在做什么,我只是从技术的角度来看。所以我可能没有资格给出正确的答案:(