2016-08-23 12 views
2

私はパンダのデータフレームを持っています条件付きで特定の列を置き換えたいのですが。パンダがデフォルト値の代わりに

例えば:私は、その後のdict、私は彼らが3

のデフォルト値を持つようにしたいで利用できるようになりました他のタイトルがある場合

{'Mr': 0, 'Mrs': 1, 'Miss': 2} 

としてそれらをマッピングしたい

col 

0 Mr 
1 Miss 
2 Mr 
3 Mrs 
4 Col. 

上記の例は、

col 

0 0 
1 2 
2 0 
3 1 
4 3 

regexを使わずにpandas.replace()でこれを行うことはできますか?

astypeによって int3キャストによるので速く、そして fillnaあなたは、むしろ replaceとして mapを使用することができます

答えて

6

df['col'] = df.col.map({'Mr': 0, 'Mrs': 1, 'Miss': 2}).fillna(3).astype(int) 

print (df) 
    col 
0 0 
1 2 
2 0 
3 1 
4 3 

isinnumpy.whereと条件のもう一つの解決策を:

d = {'Mr': 0, 'Mrs': 1, 'Miss': 2} 
df['col'] = np.where(df.col.isin(d.keys()), df.col.map(d), 3).astype(int) 
print (df) 
    col 
0 0 
1 2 
2 0 
3 1 
4 3 

ソリューションreplace

d = {'Mr': 0, 'Mrs': 1, 'Miss': 2} 
df['col'] = np.where(df.col.isin(d.keys()), df.col.replace(d), 3) 
print (df) 
    col 
0 0 
1 2 
2 0 
3 1 
4 3 

タイミング

df = pd.concat([df]*10000).reset_index(drop=True) 

d = {'Mr': 0, 'Mrs': 1, 'Miss': 2} 
df['col0'] = df.col.map(d).fillna(3).astype(int) 
df['col1'] = np.where(df.col.isin(d.keys()), df.col.replace(d), 3) 
df['col2'] = np.where(df.col.isin(d.keys()), df.col.map(d), 3).astype(int) 
print (df) 

In [447]: %timeit df['col0'] = df.col.map(d).fillna(3).astype(int) 
100 loops, best of 3: 4.93 ms per loop 

In [448]: %timeit df['col1'] = np.where(df.col.isin(d.keys()), df.col.replace(d), 3) 
100 loops, best of 3: 14.3 ms per loop 

In [449]: %timeit df['col2'] = np.where(df.col.isin(d.keys()), df.col.map(d), 3).astype(int) 
100 loops, best of 3: 7.68 ms per loop 

In [450]: %timeit df['col3'] = df.col.map(lambda L: d.get(L, 3)) 
10 loops, best of 3: 36.2 ms per loop 
+0

あるいは(私はそれを計時していない) - 'df.col.map(ラムダL:d.get(1,3))' –

+0

phuuu、それは、非常に遅いので、私は 'in [4]を取得します:%timeit df ['col3'] = df.col.map(lambda L:d.get(L、3))' '10ループ、 36.2 ms /ループ ' – jezrael

+0

私は期待したものではありません...' df.col.apply(d.get、args =(3、)) 'についてはどうでしょうか? –

関連する問題