2016-07-21 5 views
2

データを扱うときに、しばしばデータ型を変更する必要があります。例えば、リストの内包表記を使用して - たとえば列のリストを別のデータ型に変更するためのもっとpythonic(またはpandorable)な方法

In [11]: import pandas as pd 

    In [12]: import numpy as np 

    In [13]: df = pd.DataFrame({'col2': {0: 'apples', 1: 'oranges', 2: 'rabbit'}, 'col1': {0: 'white', 1: 'marshmallow', 2: 'bandwagon'}} 
) 

    In [14]: df.dtypes 
    Out[14]: 
    col1 object 
    col2 object 
    dtype: object 

    In [15]: for col in cols: 
     df[col] = df[col].astype('category') 
     ....: 

In [16]: df.dtypes 
Out[16]: 
col1 category 
col2 category 
dtype: object 

については

はこれを行うにはより多くのパンダ優しい方法はありますか?私はforループが遅いと感じます...

これは私がしなければならない本当に一般的なことです。私が気づいていないイディオムがあるかどうかは不思議です。

+0

残念ながら 'df.astype( 'カテゴリ')'は動作しません。私は、リストの理解や 'df.apply(lambda x:x.astype( 'ca tegory ')) '、リストの理解はおそらくここで最も速いと思う – EdChum

+0

これを行うにはリストの理解をどのように書きますか? –

+1

'pd.concat(df [col] dstのcolのためのdt [col] .astype( 'category')、axis = 1)'これははるかに高速であれば大規模なデータセットを試してみないとわかりません – EdChum

答えて

1

あなたの解決策は素晴らしいと思います。

もう一つは、次のとおりです。

df[['col1','col2']] = df[['col1','col2']].apply(lambda x: x.astype('category')) 

タイミング

In [32]: %timeit (orig(df)) 
10 loops, best of 3: 27.8 ms per loop 

In [33]: %timeit df.apply(lambda x: x.astype('category')) 
10 loops, best of 3: 41.5 ms per loop 

In [34]: %timeit pd.concat([df[col].astype('category') for col in df], axis=1) 
100 loops, best of 3: 18.7 ms per loop 

コードのタイミングについて:

df = pd.DataFrame({'col2': ['apples', 'oranges', 'rabbit'], 
        'col1': ['white', 'marshmallow', 'bandwagon']}) 

df = pd.concat([df]*1000) 
df = pd.concat([df]*100, axis=1) 
df.columns = range(df.shape[1]) 

df[df.columns] = df[df.columns].apply(lambda x: x.astype('category')) 
print (df) 


df = pd.concat([df[col].astype('category') for col in df], axis=1) 
print (df) 


def orig(df): 
    for col in df.columns: 
     df[col] = df[col].astype('category') 
    return df 
+0

これはかなり遅くて、まともなソリューションです。 –

+0

concatソリューションがより高速であることを興味深く確認します。 –

+0

はい。あなたのソリューションはより速くなると思います。 – jezrael

関連する問題