Ich habe mehrere ziemlich große Datenframes (> 1 Million Zeilen). In einer Spalte sind Strings unterschiedlicher Länge. Ich möchte diese Strings in einzelne Zeichen aufteilen, wobei jedes einzelne Zeichen in einer Spalte platziert wird.Effizient konvertieren Sie eine Spalte von Strings in mehrere Spalten von einzelnen Zeichen in Pandas
Ich kann dies tun mit pd.DataFrame.apply()
- siehe unten - aber es ist viel zu langsam, um praktisch zu verwenden (und es hat auch eine Tendenz, den Kernal abzustürzen).
import pandas as pd
df = pd.DataFrame(['AAVFD','TYU?W_Z', 'SomeOtherString', 'ETC.'], columns = ['One'])
print df
One
0 AAVFD
1 TYU?W_Z
2 SomeOtherString
3 ETC.
Convert Strings Listen unterschiedlicher Länge:
S1 = df.One.apply(list)
print S1
0 [A, A, V, F, D]
1 [T, Y, U, ?, W, _, Z]
2 [S, o, m, e, O, t, h, e, r, S, t, r, i, n, g]
3 [E, T, C, .]
Name: One, dtype: object
jedes einzelne Zeichen in eine Spalte Put:
df2 = pd.DataFrame(S1.values.tolist())
print df2
0 1 2 3 4 5 6 7 8 9 10 11 12 13 \
0 A A V F D None None None None None None None None None
1 T Y U ? W _ Z None None None None None None None
2 S o m e O t h e r S t r i n
3 E T C . None None None None None None None None None None
14
0 None
1 None
2 g
3 None
Leider ist dies sehr langsam. Es scheint, als ob ich in der Lage sein sollte, dies irgendwie zu vektorisieren, indem ich mich direkt mit dem numpy-Array befasse, das der df.One
-Spalte zugrunde liegt. Allerdings, wenn ich es versucht habe, denke ich, dass es Schwierigkeiten mit der Tatsache hat, dass die Saiten in der Länge variieren.
Hmm, ich habe Probleme das erste Bit immer vielleicht zu arbeiten, weil ich bin mit Python 2? Ich bekomme "ValueError: neuer Typ nicht kompatibel mit Array." – Ben
@Ben Ja, es gab diesen Unicode-Übergang, als sie zu Python3 wechselten. Könntest du bitte versuchen, ob 'S1' statt 'U1' für dich funktioniert? –
Tatsächlich tut es das. Vielen Dank! – Ben