2017-08-04 1 views
0

Hey Ich schaute durch einige der Post, aber ich konnte keine direkte Antwort finden. Ich arbeite an einem Pandas DataFrame, der zwei Spalten ZipCode und ZipCodePlusFour hat. Einige der ZipCodePlusFour-Zellen sind gefüllt. Alle ZipCode-Zellen sind gefüllt. Das Problem ist, dass der ZipCode 9 Ziffern hat. Also versuche ich, die letzten 4 Ziffern der 9-stelligen Postleitzahlen loszuwerden und sie in ZipCodePLusFour zu speichern.Lambda wenn Aussage oder nichts tun Pandas

df['ZipCode'] = df.ZipCode.astype(str) # just in case 
df['ZipCodePlusFour'] = df.ZipCode.apply(lambda x: x[-4:] if len(x) > 5 else None) 
df['ZipCode'] = df.ZipCode.apply(lambda x: x[:-4] if len(x) > 5 else 

Mein Problem ist in der zweiten Zeile. Die if-Anweisung tut, was sie tun soll, aber die andere sollte nichts tun. Ich habe versucht, None zu setzen, aber es füllt die Zellen mit None, anstatt den Wert zu verlassen, der bereits in der Zelle war.

+3

'sonst x' es zu halten, wie –

+0

ist denke ich löse das, du solltest einfach den 'else' Teil entfernen? –

+0

Die Logik ist * wenn die Zeichenkette 6 oder mehr Zeichen hat, trimme es auf die letzten 4, wenn es 5 Zeichen hat, lasse es bei 5 * ...? Frage nur, ob das vielleicht ein Fehler von eins nach dem anderen ist, denn wenn die Regel einfach "auf maximal 4 Zeichen trimmen" soll, ist keine "if..else" nötig. – deceze

Antwort

0

Wenn Sie Werte übergeben, die weniger als 5 Ziffern Länge können Sie es wie folgt tun:

df['ZipCode'] = df.ZipCode.apply(lambda x: x[-4:] if len(x) > 5 else x) 

Aber Sie können es einfacher machen, keine Notwendigkeit Länge zu überprüfen:

df['ZipCode'] = df.ZipCode.apply(lambda x: x[-4:]) 
+0

Danke das ist perfekt. – Katan

0

Alles, was Sie wollen, ist, die Saiten auf fast 5 Stellen zu trimmen. Sie können df.ZipCode.str[:5] tun?

In [78]: df 
Out[78]: 
    ZipCode 
0 123456789 
1  123 
2   0 

Für, 5 Plätze ZipCodes

In [79]: df.ZipCode.str[:5] 
Out[79]: 
0 12345 
1  123 
2  0 
Name: ZipCode, dtype: object 

Für die extra (> 5) Teil Zeichen in zipcodes

In [80]: df.ZipCode.str[5:] 
Out[80]: 
0 6789 
1 
2 
Name: ZipCode, dtype: object