【问题标题】:column index out of range with a data frame列索引超出数据框范围
【发布时间】:2020-11-17 07:22:04
【问题描述】:

我目前正在训练一个神经网络。我想以 80:20 的比例分割我的训练和验证数据。我想要全额购买。 不幸的是,我收到了IndexError: column index (12) out of range。我怎样才能解决这个问题?在此位置发生错误mat[purchaseid, itemid] = 1.0。所以我总是在每次购买后拆分(完整购买 = 如果我的所有行都具有相同的 purchaseid)。

数据框:

d = {'purchaseid': [0, 0, 0, 1, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 9, 9, 9, 9],
     'itemid': [ 3, 8, 2, 10, 3, 10, 4, 12, 3, 12, 3, 4, 8, 6, 3, 0, 5, 12, 9, 9, 13, 1, 7, 11, 11]}
df = pd.DataFrame(data=d)
print(df.head(20))

方法:

PERCENTAGE_SPLIT = 20
def splitter(df):
  df_ = pd.DataFrame()
  sum_purchase = df['purchaseid'].nunique()
  amount = round((sum_purchase / 100) * PERCENTAGE_SPLIT)
  
  random_list = random.sample(df['purchaseid'].unique().tolist(), amount)
  df_ = df.loc[df['purchaseid'].isin(random_list)]
  df_reduced = df.loc[~df['purchaseid'].isin(random_list)]
  return [df_reduced, df_]

def generate_matrix(dataframe, name):
  mat = sp.dok_matrix((dataframe.shape[0], len(dataframe['itemid'].unique())), dtype=np.float32)
  for purchaseid, itemid in zip(dataframe['purchaseid'], dataframe['itemid']):
      mat[purchaseid, itemid] = 1.0 # At this position is the error
  return mat

致电:

dfs = splitter(df)
df_tr = dfs[0].copy(deep=True)
df_val = dfs[1].copy(deep=True)

train_mat_ = generate_matrix(df_tr, 'train')
val_mat_ = generate_matrix(df_val, 'val')

错误:

IndexError: column index (12) out of range

数据框:

#df
        purchaseid  itemid
    0            0       3
    1            0       8
    2            0       2
    3            1      10
    4            2       3
    5            2      10
    6            3       4
    7            3      12
    8            3       3
    9            4      12
    10           4       3
    11           4       4
    12           5       8
    13           5       6
    14           5       3
    15           6       0
    16           6       5
    17           6      12
    18           7       9
    19           7       9



 # df_tr
        purchaseid  itemid
    0            0       3
    1            0       8
    2            0       2
    3            1      10
    4            2       3
    5            2      10
    6            3       4
    7            3      12
    8            3       3
    9            4      12
    10           4       3
    11           4       4
    12           5       8
    13           5       6
    14           5       3
    18           7       9
    19           7       9
    20           8      13

   # df_val
        purchaseid  itemid
    15           6       0
    16           6       5
    17           6      12
    21           9       1
    22           9       7
    23           9      11
    24           9      11

【问题讨论】:

  • 解决问题的另一种方法可能是使用 groupby 数据框方法。 groupby doc
  • 矩阵的维度可能设置错误。

标签: python pandas dataframe matrix


【解决方案1】:

试试这个。 sp.dok_matrix 需要目标矩阵的维度。我假设purchaseid 的范围在 [ 0, max(purchaseid) ] 范围内,itemid 的范围在 [ 0, max(itemid) ] 范围内查看您的数据。

def generate_matrix(dataframe, name):
  mat = sp.dok_matrix((dataframe['purchaseid'].max() + 1, dataframe['itemid'].max() + 1), dtype=np.float32)
  for purchaseid, itemid in zip(dataframe['purchaseid'], dataframe['itemid']):
      mat[purchaseid, itemid] = 1.0 # At this position is the error
  return mat

【讨论】:

  • 感谢您的评论。但是我在model.fit()InvalidArgumentError: 2 root error(s) found. (0) Invalid argument: indices[3,0] = 98 is not in [0, 98)中遇到了错误
  • @Aline 我在您的问题中没有看到model.fit() 的任何代码。它在其他地方中断,这显然超出了您当前问题描述的范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 2022-07-12
  • 1970-01-01
  • 2020-03-17
  • 2018-12-16
  • 2014-08-25
  • 2012-08-24
相关资源
最近更新 更多