2016-11-23 13 views
1

ここでは私のデータフレームです:パンダ - 各行にヒストグラムバケットを割り当てる

import pandas as pd 
df = pd.DataFrame({'A': [1, 2, 3, 4, 6, 4, 3, 2, 7]}) 
buckets = [(0,3),(3,5),(5,9)] 

私はまた、上記のヒストグラム・バケットを持っています。今度はバケットインデックスにデータフレームの各行を割り当てたいと思います。私はループでそれを行うことができますが、私はかなり大きなデータフレーム(2.5ミルの行を)持っている、もちろん

df['buckets_index'] = [0,0,0,1,2,1,0,0,2] 

ので、私はそれがすぐに終らする必要があります。だから私は、次の情報で新しい列を取得したいと思い。

どのような考えですか?

+0

は、バケットの制限は、前のバケットの終わりは、常に次の1の開始と同じになるようでしょうか? – Divakar

+0

@Divakar、良い質問ありがとうございます。区間は左から開き、右の '(0,3、(3,5)、(5,9)'と閉じています。 – user1700890

+0

'df.A'の中には、 – Divakar

答えて

2

013とpd.cutを使用できますあなただけのインデックスをしたい場合:

buckets = [0,3,5,9] 
df['bucket'] = pd.cut(df['A'], bins=buckets) 
df['bucket_idx'] = pd.cut(df['A'], bins=buckets, labels=False) 

結果の出力:

A bucket bucket_idx 
0 1 (0, 3]   0 
1 2 (0, 3]   0 
2 3 (0, 3]   0 
3 4 (3, 5]   1 
4 6 (5, 9]   2 
5 4 (3, 5]   1 
6 3 (0, 3]   0 
7 2 (0, 3]   0 
8 7 (5, 9]   2 
+0

必要ならば、カテゴリ型dtypeではなく整数を得るために '.cat.codes'を追加することができます – jeremycg

1

あなたはnp.searchsorted使用することができます -

df['buckets_index'] = np.asarray(buckets)[:,1].searchsorted(df.A.values) 

ランタイムテスト -

In [522]: df = pd.DataFrame({'A': np.random.randint(1,8,(10000))}) 

In [523]: buckets = [0,3,5,9] 

In [524]: %timeit pd.cut(df['A'], bins=buckets, labels=False) 
1000 loops, best of 3: 460 µs per loop # @root's soln 

In [525]: buckets = [(0,3),(3,5),(5,9)] 

In [526]: %timeit np.asarray(buckets)[:,1].searchsorted(df.A.values) 
10000 loops, best of 3: 166 µs per loop 

制限外の例:このような場合のためにを、私たちはそうのように、クリッピングを使用する必要がある -

np.asarray(buckets)[:,1].searchsorted(df.A.values).clip(max=len(buckets)-1) 
+0

私はあなたとあなたの両方のソリューションに感心しています。あなたの答えを正しいものとして数えたいと思っています。私は下位のランクを持っているので、私はrootに答えます。あなたは気にしません。 – user1700890

+0

@ user1700890確かに、それは大丈夫です!:) – Divakar

関連する問題