2016-03-31 7 views
2

Ich habe eine Pandas df:Splitting Listen in Spalten

name time 
1 a  1 year 2 months 
2 b  4 years 1 month 
3 c  3 years 1 month 

Ich möchte mit beenden:

name years months 
1 a  1  2 
2 b  4  1 
3 c  3  1 

ich so weit wie kann:

name time 
1 a  [1, 2] 
2 b  [4, 1] 
3 c  [3, 1] 

aber ich kann Finde nicht heraus, wie man die Listen in Spalten aufteilt.

Antwort

4
df = pd.DataFrame({'name': ['a', 'b', 'c'], 
        'time': ['1 year 2 months', '4 years 1 month', '3 years 1 month']}) 

# Split the time column and take the first and third elements to extract the values. 
df[['years', 'months']] = df.time.str.split(expand=True).iloc[:, [0, 2]].astype(int) 

>>> df 
    name    time years months 
0  a 1 year 2 months  1  2 
1  b 4 years 1 month  4  1 
2  c 3 years 1 month  3  1 

Sie können del df['time'] verwenden, wenn Sie bereit sind, diese Spalte zu löschen.

+0

tatsächlich genannt Sie Ihre Spalten falsch, sollten erste Jahr sein, die zweite - Monat .. –

+0

korrigiert. Danke, dass du es aufgezeigt hast. – Alexander

+0

Absolut funktioniert. Geringfügiges Problem mit meinen Daten, indem ich dieses fand, fand ich, dass es einige Einträge gibt, wo Zeit "1-11 Monate" ohne ein Jahr davor ist. Irgendwelche Gedanken, wie man damit umgeht? –

1

könnten Sie str.findall verwenden Ziffern in Ihrer Zeit Spalten zu finden und dann mit str.join und str.split Sie Ihr Ergebnis bekommen können:

In [240]: df.time.str.findall('\d').str.join('_').str.split('_', expand=True) 
Out[240]: 
    0 1 
0 1 2 
1 4 1 
2 3 1 

df[['years', 'months']] = df.time.str.findall('\d').str.join('_').str.split('_', expand=True) 

In [245]: df 
Out[245]: 
    name    time years months 
0 a 1 year 2 months  1  2 
1 b 4 years 1 month  4  1 
2 c 3 years 1 month  3  1 

ein bisschen schneller Es ist dann @ Alexander-Lösung, und ich denke, allgemeiner. Von Timing:

In [6]: %timeit df.time.str.split(expand=True).iloc[:, [0, 2]] 
1000 loops, best of 3: 1.6 ms per loop 

In [8]: %timeit df.time.str.findall('\d').str.join('_').str.split('_', expand=True) 
1000 loops, best of 3: 1.43 ms per loop