2017-06-08 3 views
2

私は、0から50の範囲の実数データを保持する1列のパンダのデータフレームを持っています。私が使用して分布を得ることができますデータの分布を考慮してDiscretisize Pandasの列

:私がやりたい何

hist, bins = np.histogram(df["col"]) 

は、それが中に落ちビン数ですべての値を置き換えることである

をそうするために、これは働いていました。

for i in range(len(df["speed_array"])): 
    df["speed_array"].iloc[i] = np.searchsorted(bins, df["speed_array"].iloc[i]) 

しかし、行のより4百万のデータフレームと、それは非常に遅い(50分)です。私はこれにもっと効率的な方法を探しています。あなたたちはもっと良いアイデアを持っていますか?

答えて

2

は、単に全体の基盤となる配列データにnp.searchsortedを使う -

df["speed_array"] = np.searchsorted(bins, df["speed_array"].values) 

ランタイムテストを -

In [140]: # 4 million rows with 100 bins 
    ...: df = pd.DataFrame(np.random.randint(0,1000,(4000000,1))) 
    ...: df.columns = [['speed_array']] 
    ...: bins = np.sort(np.random.choice(1000, size=100, replace=0)) 
    ...: 

In [141]: def searchsorted_app(df): 
    ...:  df["speed_array"] = np.searchsorted(bins, df["speed_array"].values) 
    ...:  

In [142]: %timeit searchsorted_app(df) 
10 loops, best of 3: 15.3 ms per loop 
+1

私が夢見たのと同じくらい簡単!ありがとう! – Xema

+0

@Xemaオリジナルの '50min'マークよりもスピードアップを知っていいですか? – Divakar

+0

まあ、それはかなり瞬間でした! – Xema

関連する問題