2017-02-13 6 views
2

私は私のpandasデータフレーム列を因数分解しましたが、元の列値を上書きしました。pandasは因数分解されたデータフレームから文字列ラベルを取得します

参照用に元のマッピング値を戻す方法はありますか?

例:

df_test = pd.DataFrame({'col1': pd.Series(['cat','dog','cat','mouse'])}) 
df_test['col1'] = pd.factorize(df_test['col1'])[0] 
df_test 

enter image description here

しかし、私は整数にマップするかどうか確認するために、再度以下呼び出すことができるようにしたいです。データフレームを再初期化せずにマッピングをチェックする方法はありますか?

pd.factorize(df_test)[1] 

答えて

1

私はあなたの少し異なるアプローチをお勧めしたい - categorical dtypeを使用する:あなたは数字が必要な場合

In [40]: df_test['col1'] = df_test['col1'].astype('category') 

In [41]: df_test 
Out[41]: 
    col1 
0 cat 
1 dog 
2 cat 
3 mouse 

In [42]: df_test.dtypes 
Out[42]: 
col1 category 
dtype: object 

と:

In [74]: df_test = pd.DataFrame({'col1': pd.Series(['cat','dog','cat','mouse'])}) 

In [75]: df_test = pd.concat([df_test] * 10**5, ignore_index=True) 

In [76]: df_test.shape 
Out[76]: (400000, 1) 

In [77]: d1 = df_test.copy() 

In [78]: d2 = df_test.copy() 

In [79]: d1.col1 = pd.factorize(d1.col1)[0] 

In [80]: d2.col1 = d2.col1.astype('category') 

In [81]: df_test.info() 
<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 400000 entries, 0 to 399999 
Data columns (total 1 columns): 
col1 400000 non-null object 
dtypes: object(1) 
memory usage: 3.1+ MB 

In [82]: d1.info() 
<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 400000 entries, 0 to 399999 
Data columns (total 1 columns): 
col1 400000 non-null int64 
dtypes: int64(1) 
memory usage: 3.1 MB 

In [83]: d2.info() 
<class 'pandas.core.frame.DataFrame'> 
RangeIndex: 400000 entries, 0 to 399999 
Data columns (total 1 columns): 
col1 400000 non-null category 
dtypes: category(1) 
memory usage: 390.7 KB   # categorical column takes almost 8x times less memory 
:400K DATAFRAMEため

In [44]: df_test['col1'].cat.codes 
Out[44]: 
0 0 
1 1 
2 0 
3 2 
dtype: int8 

メモリ使用量を

+0

何をしているのが私の上書きです'df_test ['col1'] = df_test ['col1'] .cat.codes'のカテゴリコードでオリジナルを作成します。だから私はカテゴリーに猫のコードをマップすることができるように、私は2つのデータフレームを作成する必要があります1つはすべてcat.codes、もう1つはまだマッピングのカテゴリがありますか?それとも良い方法がありますか? – jxn

関連する問題