2016-05-13 5 views
0

私はPythonでSVDをやっています。私のデータインデックスの範囲は150,000から160,000です。このため、SVDは非常にリソースを大量に消費しています。重複を維持しながら、このデータの範囲を0〜10,000に変更するにはどうすればよいですか。Pythonで数字の範囲を変更する

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)

+4

ここの答えのように聞こえるのはちょうど「150000を引く」ということです。 150000を減算して助けが必要な場合は、より多くのコンテキストを参照する必要があります。 – user2357112

+0

user2357112には、次のように記載されています: 'remapped_data = [num-numデータの150000番] ' –

+0

Scipyには疎な行列関数があります。 – davo36

答えて

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]) 

これらの要件を反映するために質問を更新してください。

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 

FYI私のデータは、私が最終的な結果を得るデータでこの機能を実行した後、この

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 
+0

?これはあなたの質問と関係がありますか? 150001ものはどこですか? – mwm314

+0

私はあなたに私のデータの別の例を与えています。データは異なりますが、ポイントは変わりません。 –

+0

映画の列が変更されたのはなぜですか?あなたはそれをするつもりでしたか? – mwm314

1

IIUCを、あなたはシリーズでrank(method='dense')を使用することができ(docs)

>>> 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 
+0

ありがとうございます。それはうまくいった。 –

関連する問題