2016-03-31 3 views
2

У меня есть панд ДФ:Расщепление списки в колонках

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

Я хочу закончить:

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

я могу получить, насколько:

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

, но я могу 't выяснить, как разбить списки на столбцы.

ответ

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 

Вы можете использовать del df['time'], когда будете готовы отказаться от этой колонки.

+0

на самом деле вы назвали ваши колонки неправильно, первый должен быть год, второй - месяц .. –

+0

Исправлено. Спасибо, что указали это. – Alexander

+0

Абсолютно работает. Незначительная проблема с моими данными, используя это, я обнаружил, что есть несколько записей, где время составляет «1-11 месяцев» без года до них. Любые мысли о том, как с этим справиться? –

1

Вы можете использовать str.findall найти цифры в свое время столбцов, а затем с str.join и str.split вы могли бы получить ваш результат:

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 

Это немного быстрее, чем @ решение Александра, и я думаю, что более общий характер. От времени:

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 
Смежные вопросы