2016-05-30 3 views
1

私は多くのカテゴリ変数を持つPythonでデータフレームを持っており、ターゲット変数はバイナリです。変数の各カテゴリの目標変数イベントレート(目標変数の平均と同じ)のランクに基づいてカテゴリ変数を序数に変換したいと思います。例えば、以下の場合は、カラム1の各カテゴリについては、私の元のデータセットpythonの別の変数のイベントレートに基づいてカテゴリ変数を順序に再コード化する方法はありますか?

enter image description here

で、別名、 'A' と 'B' は、我々が持っている:COLUMN2上の各categryについては enter image description here

、別名'C'、 'D'、 'E'、 'F'、 'G'、我々は持っている:

enter image description here

だから私はこのような、最終的なデータセットを作成することができるようにしたい:

enter image description here

どうすればいいですか?

ありがとう!!!!

答えて

0

groupedカテゴリの値に対してはmean、結果はrank、カテゴリの値はmapと計算されます。イラストのサンプルデータ:両方の列を生成するために、上記の線に沿って

import string 
abc = string.ascii_uppercase 
df = pd.DataFrame({'target': np.random.randint(low=0, high=2, size=10), 'col1': np.random.choice(list(abc[:2]), size=10), 'col2': np.random.choice(list(abc[:5]), size=10)}) 

    col1 col2 target 
0 B B  0 
1 A E  0 
2 B A  1 
3 B E  1 
4 A A  0 
5 A E  0 
6 B D  1 
7 A E  0 
8 A E  1 
9 B B  0 

コード:

for col in ['col1', 'col2']: 
    df[col] = df.loc[:, col].map(df.groupby(col).target.mean().rank().astype(int)) 

    col1 col2 target 
0  2  1  0 
1  1  2  0 
2  2  3  1 
3  2  2  1 
4  1  3  0 
5  1  2  0 
6  2  4  1 
7  1  2  0 
8  1  2  1 
9  2  1  0 
0

あなたが何をしたいのかがtransformです。

col1 col2 target 
0 A D  1 
1 A A  0 
2 A E  0 
3 B A  0 
4 A C  0 
5 A D  1 
6 B E  0 
7 A C  0 
8 B C  0 
9 B B  0 

あなたがようgroupbyを使用して変換を得ることができます...次を見てみましょう:...

df.groupby('col1').transform(np.mean) 

    target 
0 0.333333 
1 0.333333 
2 0.333333 
3 0.000000 
4 0.333333 
5 0.333333 
6 0.000000 
7 0.333333 
8 0.000000 
9 0.000000 

今、あなただけ変換する一連の情報を必要とする

df.groupby('col1').transform(np.mean)['target'] 
0 0.333333 
1 0.333333 
2 0.333333 
3 0.000000 
4 0.333333 
5 0.333333 
6 0.000000 
7 0.333333 
8 0.000000 
9 0.000000 

pd.Seriesは、いくつかの異なる方法で因子に変換することができます。 1つの方法はpd.factorize()を使用することです。

pd.factorize(df.groupby('col1').transform(np.mean)['target']) 
(array([0, 0, 0, 1, 0, 0, 1, 0, 1, 1]), 
Float64Index([0.333333333333, 0.0], dtype='float64')) 

いるのはあなただけ織り込ん値を探しています:

pd.factorize(df.groupby('col1').transform(np.mean)['target'])[0] 
array([0, 0, 0, 1, 0, 0, 1, 0, 1, 1]) 

は今、ちょうどそれをお好み:)の列名を割り当てます。

希望します。

関連する問題