改变Python中的数字范围

时间:2016-05-13 02:09:46

标签: python pandas scipy

我在Python中进行SVD​​,我的数据索引范围是150,000到160,000。因为这个SVD变得非常耗费资源。如何在保持重复的同时将此数据的范围更改为0-10,000。

Eg: i have consecutive data points   :150001,150001,155003,156004,157005

it should map to  :1,1,2,3,4

这样范围缩小了,我不必交出高度稀疏的数据集市。

我的主要要求是我需要将(169,169,256,945,3445,9999)变换数据映射到(0,0,1,2,3,4)

3 个答案:

答案 0 :(得分:1)

IIUC,您可以在系列(docs)上使用rank(method='dense')

>>> df = pd.DataFrame({"a": [150001,150001,155003,156004,157005]})
>>> df
        a
0  150001
1  150001
2  155003
3  156004
4  157005
>>> df["a_rank"] = df["a"].rank(method="dense").astype(int)
>>> df
        a  a_rank
0  150001       1
1  150001       1
2  155003       2
3  156004       3
4  157005       4

答案 1 :(得分:1)

以下代码按排名顺序记录数字列表中唯一数字的索引:

>>> import numpy as np
>>> v = [169,169,256,945,945,945,345,9999]
>>> np.hstack([0, np.cumsum(np.diff(v)!=0)])
array([0, 0, 1, 2, 2, 2, 3, 4])

请更新问题以反映这些要求。

答案 2 :(得分:0)

我为此写了一个小函数,希望有一种更简单的方法来做同样的事情。

def range_minimizer():
    ind=0

    for i in d1.index:
        if i==0:
            d1['new_index']=0

        else:
            if d1['movie'][i]==d1['movie'][i-1]:
                d1['new_index'][i]=ind
            else:
                ind+=1
                d1['new_index'][i]=ind  

仅供参考我的数据看起来像这样

   user   movie  rating
0     1     169     2.5
1     1    2471     3.0
2     1   48516     5.0
3     2    2571     3.5
4     2  109487     4.0

在数据上运行此函数后,我得到了最终结果:

   user   movie  rating  ind
0     1     169     2.5    0
1     1    2471     3.0    1
2     1   48516     5.0    2
3     2   48516     3.5    2
4     2  109487     4.0    3