2016-07-21 5 views
2

Oft muss ich beim Streiten von Daten die Datentypen ändern.Ein pythischer (oder pandorable) Weg, um eine Liste von Spalten in verschiedene Datentypen zu ändern

Zum Beispiel

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 

Gibt es eine Pandas freundliche Art und Weise, dies zu tun - zum Beispiel unter Verwendung einer Liste Verständnis? Ich fühle, dass die for-Schleife langsam ist ...

Dies ist eine sehr häufige Sache, die ich tun muss, und ich frage mich nur, ob es ein Idiom ist mir nicht bewusst ist.

+0

leider 'df.astype ('category')' funktioniert nicht Ich bin mir nicht sicher, ob es einen viel besseren Weg gibt, als Listenverständnis oder 'df.apply (Lambda x: x.astype ('ca Tegory ')) ', ich denke, dass Listenverstehen hier am schnellsten ist – EdChum

+0

Wie würde man ein Listenverständnis schreiben, um das zu tun? –

+1

'pd.concat ([df [col] .astype ('Kategorie') für col in df], Achse = 1)' aber nicht sicher, es sei denn, Sie versuchen einen großen Datensatz, wenn dieser viel schneller ist – EdChum

Antwort

1

Ich denke, Ihre Lösung ist nett.

Ein weiterer Grund ist:

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

Timings:

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 

-Code für Timings:

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

Das ist auch ziemlich langsam, aber eine anständige Lösung. –

+0

Bestätigt interessanterweise, dass die Concat-Lösung schneller ist –

+0

Ja. Ich denke, deine Lösung wird schneller sein. – jezrael

Verwandte Themen