2016-05-31 20 views
2

Ich arbeite mit Textdaten und ich möchte einfach eine neue Spalte basierend auf einer vorhandenen Spalte auffüllen.Verwenden von Split zum Füllen einer Spalte in Pandas Dataframe

Beispiel: Die Spalte sourceEncodedID können Werte wie a.b.c haben, und ich möchte nur den zweiten Teil der Zeichenfolge extrahieren, b, wenn es einen zweiten Teil zur Verfügung steht. Hier sind einige Beispielwerte:

sourceEncodedID Branch  
a.b.c    b  
c.r.d    r  
a     a  
p     p 

Um dies zu erreichen, habe ich mit dem folgenden Code kommen:

for i in range(0,20350): 
    if len(str(artifacts.sourceEncodedID[i]).split('.')) > 1: 
     artifacts['branch'][i] = str(artifacts.sourceEncodedID[i]).split('.')[1] 
    else: 
     artifacts['branch'][i] = str(artifacts.sourceEncodedID[i]) 

Es gibt nur 20k Zeilen in dem Datenrahmen und noch dieses Stück Code nehmen Minuten ausführen, bevor Sie meinen Browser nie fertigstellen und nicht mehr reagieren (ich verwende ipython notebook). Ich hätte gedacht, das würde in ein paar Sekunden laufen.

Gibt es etwas offensichtlich albern in diesem Code, den ich nicht fangen kann? Wie repariere ich es?

Antwort

1

UPDATE2: - ich glaube, das ist etwas schneller sein wird:

x['new'] = x.sourceEncodedID.str.replace(r'[^\.]*\.([^\.]*).*', r'\1') 

-Timing auf 20K DF:

In [155]: x.shape 
Out[155]: (20000, 2) 

In [156]: %timeit x['new'] = x.sourceEncodedID.str.replace(r'[^\.]*\.([^\.]*).*', r'\1') 
10 loops, best of 3: 127 ms per loop 

UPDATE:

In [68]: x['new'] = x.sourceEncodedID 

In [69]: x 
Out[69]: 
    sourceEncodedID Branch new 
0   a.b.c  b a.b.c 
1   c.r.d  r c.r.d 
2    a  a  a 
3    p  p  p 

In [70]: x.ix[x.sourceEncodedID.str.contains('\.'), 'new'] = x.sourceEncodedID.str.split('\.', expand=True)[1] 

In [71]: x 
Out[71]: 
    sourceEncodedID Branch new 
0   a.b.c  b b 
1   c.r.d  r r 
2    a  a a 
3    p  p p 

bei der Arbeit mit pandas Datenrahmen zuerst immer Versuchen Sie, eine vektorisierte Lösung zu finden. Und nur wenn es absolut nicht möglich ist, dann überprüfen Sie es und erst danach versuchen Sie den Loop-Through-Ansatz, da er um Größenordnungen langsamer ist.

ALTE Antwort:

try this:

In [61]: x.sourceEncodedID.str.split('\.', expand=True)[1] 
Out[61]: 
0  b 
1  r 
2 None 
3 None 
Name: 1, dtype: object 
+0

Vielen Dank, es hat seinen Zweck erfüllt. Würdest du mir bitte auf die Dummheit hinweisen, die mir nicht klar ist, in meinem Code? – Patthebug

+0

@Patthebug, ich habe meine Antwort aktualisiert - bitte überprüfen Sie – MaxU

+0

Danke für das Hinzufügen der Erklärung, ich schätze es! Ich denke, es ist nur ein wenig frustrierend, denn man muss die vektorisierten Funktionen von Pandas kennen und zurück zu den Grundlagen zu gehen kostet Sie in Bezug auf die Zeit. Ich stimme zu, vektorisierte Lösungen sind besser, aber Sie müssen sie kennen. Eine Funktion nach der anderen !! – Patthebug

Verwandte Themen