2016-11-04 5 views
1

:(後\前に)次の正しい結果を生成ナンIデータセット符号化するには以下のコードを使用してい

foo= pd.DataFrame({ 
        'Col1' : ['B', 'A', 'B', 'C', 'B', 'A', 'C'], 
        'Val' : np.random.randn(7) 
        }) 
r=pd.factorize(foo['Col1'], sort=True) 
foo['Col1'] = r[0] 

Col1  Val   Col1  Val 
    B 0.094336    1 0.094336 
    A -0.422168    0 -0.422168 
    B -0.750304    1 -0.750304 
    C 1.910625    2 1.910625 
    B 0.921890    1 0.921890 
    A 0.422612    0 0.422612 
    C -1.130780    2 -1.130780 


print r 
(array([1, 0, 1, 2, 1, 0, 2]), Index([u'A', u'B', u'C'], dtype='object')) 

および(「ソート」のため)私はキーの値と実行の間のマッピング関数を作成することもできます - 私の目標は

zip(np.unique(r[0]), r[1]) 
[(0, 'A'), (1, 'B'), (2, 'C')] # A became 0; B became 1 and so on... 

私の問題i sの私は、データセットにNaNを持っており、彼らが得る-1(私が望む正確に何である - それがなければならない-1):

foo= pd.DataFrame({ 
        'Col1' : ['B', 'A', 'B', 'C', 'B', 'A', np.nan], 
        'Val' : np.random.randn(7) 
        }) 

r=pd.factorize(foo['Col1'], sort=True) 
foo['Col1'] = r[0] 


Col1  Val   Col1  Val 
    B 1.397748   1 1.397748 
    A -1.011483   0 -1.011483 
    B 0.679650   1 0.679650 
    C 0.861900   2 0.861900 
    B -0.430241   1 -0.430241 
    A 1.472984   0 1.472984 
NaN 0.549857   -1 0.549857 

しかしpd.factorizeは、上の「ナン」を返していませんインデックス:

print r[1] 
Index([u'A', u'B', u'C'], dtype='object') 

、今の私のマッピング機能が動作しません。

zip(np.unique(r[0]), r[1]) 
Out[148]: [(-1, 'A'), (0, 'B'), (1, 'C')] 

pd.factorize機能は、そのインデックスのオブジェクトにはNaNを返すようにする方法?

おかげ

答えて

1

あなたはr[0]-1のための唯一の理由は、あなたのデータセットでnp.nanであることを保証できる場合は、次の関数を用いて所望のマッピングを得ることができますので、

def get_mapping(r): 
    if -1 in r[0]: 
     return zip(np.unique(r[0]), r[1].insert(0, np.nan)) 
    else: 
     return zip(np.unique(r[0]), r[1]) 
2

をその中に + strのdtypeが含まれています。その結果、pd.factorizeは値-1(デフォルト)を割り当てた後に欠損値を除外します。

これに代わる方法として、シリーズに存在する固有の値を計算し、後でNansに値-1を割り当て、codes属性を使用してcategorical dtypeに変換することもできます。

デモ:

ser = pd.Series(foo['Col1'].unique(), dtype='category') 
ser 
Out[125]: 
0  B 
1  A 
2  C 
3 NaN 
dtype: category 
Categories (3, object): [A, B, C] 

print(list(zip(ser, ser.cat.codes))) 
#[('B', 1), ('A', 0), ('C', 2), (nan, -1)] 
関連する問題