2016-07-26 7 views
2

以下の簡単な例を考えてみましょう。分位数に対応するカテゴリを含むカテゴリ変数を取得することに興味があります。データに結びついているときにパンダで分位数ビンを計算する方法は?

df = pd.DataFrame({'A':'foo foo foo bar bar bar'.split(), 
         'B':[0, 0, 1]*2}) 

df 
Out[67]: 
    A B 
0 foo 0 
1 foo 0 
2 foo 1 
3 bar 0 
4 bar 0 
5 bar 1 

パンダでは、qtileがジョブを実行します。残念ながら、qtileはデータの関係が原因でここで失敗します。

df['C'] = df.groupby(['A'])['B'].transform(
        lambda x: pd.qcut(x, 3, labels=range(1,4))) 

ができます古典的なValueError: Bin edges must be unique: array([ 0. , 0. , 0.33333333, 1. ])

車輪の再発明をする必要はありません(他のPythonパッケージから)別の堅牢なソリューションがありますか?

する必要があります。私は自分自身の分位数bin関数をコード化したくない。まともな統計パッケージでは、分位数ビン(SASStataなど)を作成するときの結びつきを処理できます。

私は、方法論的な選択肢が堅牢で堅牢であることに基づいています。

たとえば、SAS https://support.sas.com/documentation/cdl/en/proc/61895/HTML/default/viewer.htm#a000146840.htmのソリューションをご覧ください。

また、Stata(http://www.stata.com/manuals13/dpctile.pdf)のよく知られているxtileについては、こちらをご覧ください。これをメモしてくださいDefinitive way to match Stata weighted xtile command using Python?

私は何が欠けていますか?たぶんScipyを使用していますか?

多くの感謝!

答えて

3

IIUC、あなたはnumpy.digitize

df['C'] = df.groupby(['A'])['B'].transform(lambda x: np.digitize(x,bins=np.array([0,1,2]))) 

    A B C 
0 foo 0 1 
1 foo 0 1 
2 foo 1 2 
3 bar 0 1 
4 bar 0 1 
5 bar 1 2 
+0

感謝を使用することができます@NickilMaveliあなたがPD 'の出力を渡すことができ、その場合には –

+1

' numpy.digitize'は分位のビンを作成していないようだが、むしろ直線的に間隔をあけたビン.quantile() 'メソッドを' np.digitize'関数に追加します。一意でない値が存在する場合、最後の四分位(ここでは3)に関連付けられた整数が割り当てられます。 –

+0

本当に素晴らしい提案。残念ながら、私はそれらを最小四分位に置くことがより一般的であると思います。多分、そこに別の解決策があります。 –

関連する問題