【问题标题】:Select non-NaN data randomly from a pandas DF (both row and col have to be random)从 pandas DF 中随机选择非 NaN 数据(行和列都必须是随机的)
【发布时间】:2017-10-13 15:58:18
【问题描述】:

我正在构建一个推荐系统,这里有一些评分数据。 每行代表一个用户,每列代表一个产品,每个数据点代表用户对产品的评分。

in: np.array(df)

array([[ 0.,  5.,  5.,  0.,  0.,  1.],
       [ 5.,  0.,  4.,  0.,  1.,  0.],
       [ 4.,  0.,  5.,  0.,  0.,  0.],
       [ 5.,  0.,  5.,  0.,  0.,  0.],
       [ 4.,  5.,  0.,  0.,  0.,  0.],
       [ 0.,  4.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  4.,  4.,  0.],
       [ 0.,  0.,  0.,  0.,  5.,  4.],
       [ 0.,  0.,  0.,  5.,  0.,  5.],
       [ 0.,  0.,  0.,  0.,  5.,  0.],
       [ 0.,  0.,  0.,  5.,  0.,  0.],
       [ 5.,  0.,  0.,  1.,  0.,  0.]])

我有一个类似于上面的 pandas 数据框(我将它放入一个 numpy 数组中,以便在 stackoverflow 上查看)。

对于每一行,我想选择 10% 的非零项,并将其设置为 0。但是,我还想将每个修改单元格的行号和列号捕获到字典中。 (如果我将某个单元格设置为 0,我想记录我已将哪个单元格更改为 0)

我目前的解决方案是先将所有零更改为 NaN。然后,使用这个 NaN 数据框,当我将数据点设置为 0 时,我能够识别出我修改了哪些单元格。

in: np.array(df[df.iloc[:] !=0])

out: array([[ nan,   5.,   5.,  nan,  nan,   1.],
       [  5.,  nan,   4.,  nan,   1.,  nan],
       [  4.,  nan,   5.,  nan,  nan,  nan],
       [  5.,  nan,   5.,  nan,  nan,  nan],
       [  4.,   5.,  nan,  nan,  nan,  nan],
       [ nan,   4.,  nan,  nan,  nan,  nan],
       [ nan,  nan,  nan,   4.,   4.,  nan],
       [ nan,  nan,  nan,  nan,   5.,   4.],
       [ nan,  nan,  nan,   5.,  nan,   5.],
       [ nan,  nan,  nan,  nan,   5.,  nan],
       [ nan,  nan,  nan,   5.,  nan,  nan],
       [  5.,  nan,  nan,   1.,  nan,  nan]])

但是,我不确定如何从每行中随机选择 10% 的非 NaN 数据,以及如何存储我已修改的单元格的行索引和列名。 :

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我不知道向量化方法是否可行(因为您要从每一行中选择可变数量的项目),但如果您愿意在 Python 中使用循环,这很简单(在赛通):

    import random
    import math
    from itertools import groupby
    
    nonzero_indices = list(zip(*np.where(data != 0)))
    indices_to_drop = []
    for _, g in groupby(nonzero_indices, lambda x:x[0]):
        li=list(g)
        indices_to_drop += random.sample(li,math.ceil(len(li)/10))
        # sample a tenth, rounded up, of each row's non-zero items
    for idx in indices_to_drop:
        data[idx] = 0
    

    另外,如果您选择这样做,请在 NumPy 中进行,稍后再构建 Pandas 数据框,因为通过 pandas 索引底层数组非常缓慢。

    【讨论】:

      猜你喜欢
      • 2013-04-02
      • 2019-01-27
      • 1970-01-01
      • 1970-01-01
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      相关资源
      最近更新 更多