我在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)
答案 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