2017-12-07 13 views
1

Ich habe einen Datenrahmen mit 4 Spalten mit dem Wert wie folgt aus:Split Spalte in zwei neue Spalten in Pandas

value_1 
over 1 - 42 -> take this ; over 3 - 4 
over 3 - 26 -> take this ; over 3 - 45 
over 5 - 25 -> take this ; over 2 - 80 

Und ich brauche durch zwei Spalte von jedem von ihnen durch Spaltung zu machen ‚;‘. Und wenn ich versuche, dieses:

s = df['value_1'].apply(lambda x: x.split(';')) 
df['value_left'] = s.apply(lambda x: x[0]) 
df['value_right'] = s.apply(lambda x: x[1]) 

Oder diese:

f['new_value1'] = df['value_1'] 
df['value_1_right'] = None 
df['value_1_right'].update(df.new_band_bandw_1.apply(lambda x: x.str.split(';')[1] 
         if len(x.str.split()) == 2 else None)) 

bekam ich die gleiche error: List index out of range. Was ist das Problem, ist es möglich, dass die Werte in irgendeiner Art von Liste sind?

Jede Art von Lösung ist willkommen. Dank

+0

Auf welcher Linie bekommst du? ror? – Sniper

Antwort

2

Sie benötigen split:

df[['value_left','value_right']] = df['value_1'].str.split(';', expand=True) 
print (df) 

            value_1     value_left \ 
0 over 1 - 42 -> take this ; over 3 - 4 over 1 - 42 -> take this  
1 over 3 - 26 -> take this ; over 3 - 45 over 3 - 26 -> take this  
2 over 5 - 25 -> take this ; over 2 - 80 over 5 - 25 -> take this  

    value_right 
0 over 3 - 4 
1 over 3 - 45 
2 over 2 - 80 

Probe für mehrere ; - ist möglich, festzulegen, welche ; für Split verwendet wird:

df = pd.DataFrame({ 
    'value_1': ['a;r;e','b;r','c;g;t;e'] 
}) 
print (df) 

    value_1 
0 a;r;e 
1  b;r 
2 c;g;t;e 

df[['value_left','value_right']] = df['value_1'].str.split(';', expand=True, n=1) 
print (df) 
    value_1 value_left value_right 
0 a;r;e   a   r;e 
1  b;r   b   r 
2 c;g;t;e   c  g;t;e 
+0

Es sieht gut aus, aber ich habe das; ValueError: Spalten müssen die gleiche Länge wie der Schlüssel haben – jovicbg

+0

Es bedeutet, es gibt mehrere ';', also 'df [' value_1 ']. Str.split ('; ', expand = True, n = 1) 'sollte helfen – jezrael

+0

Ja, Danke. :) – jovicbg

2

Ein anderer Weg, mit String partition dh

df[['val1','val2']] = df[0].str.partition(';').iloc[:,0::2] 

            0      val1   val2 
0 over 1 - 42 -> take this ; over 3 - 4 over 1 - 42 -> take this  over 3 - 4 
1 over 3 - 26 -> take this ; over 3 - 45 over 3 - 26 -> take this  over 3 - 45 
2 over 5 - 25 -> take this ; over; 2 - 80 over 5 - 25 -> take this  over; 2 - 80 
Verwandte Themen