повторение re.split () на фрейме данных - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь использовать re.split (), чтобы разделить одну переменную в фрейме данных pandas на две другие переменные.

Мои данные выглядят так:

   xg              
0.05+0.43
0.93+0.05
0.00
0.11+0.11
0.00
3.94-2.06

Я хочу создать

 e      a
0.05  0.43
0.93  0.05
0.00  
0.11  0.11
0.00
3.94  2.06

Я могу сделать это с помощью цикла for и индексации.

for i in range(len(df)):
    if df['xg'].str.len()[i] < 5:
        df['e'][i] = df['xg'][i]
    else:
        df['e'][i], df['a'][i] = re.split("[\+ \-]", df['xg'][i])

Однако это медленно, и я не верю, что это хороший способ сделать это, и я пытаюсь улучшить свое понимание кода / python.

Я делал различные попытки, пытаясь написать его, используя np.where, или используя понимание списка или применяя лямбду, но я не могу запустить его слишком.Я думаю, что все проблемы у меня связаны с тем, что я пытаюсь применить функции ко всей серии, а не к позиционному значению.

Если у кого-то есть идея лучшего метода, чем мой уродливый цикл for, я был бы оченьинтересно.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Это может быть то, что вы хотите.Не уверен, что это элегантно, но должно быть быстрее, чем цикл Python.

import pandas as pd
import numpy as np

data = ['0.05+0.43','0.93+0.05','0.00','0.11+0.11','0.00','3.94-2.06']
df = pd.DataFrame(data, columns=['xg'])

# Solution
tmp = df['xg'].str.split(r'[ \-+]')
df['e'] = tmp.apply(lambda x: x[0])
df['a'] = tmp.apply(lambda x: x[1] if len(x) > 1 else np.nan)
del(tmp) 
0 голосов
/ 21 ноября 2018

Заимствовано из этого ответа с использованием метода str.split с аргументом расширения: https://stackoverflow.com/a/14745484/3084939

df = pd.DataFrame({'col': ['1+2','3+4','20','0.6-1.6']})
df[['left','right']] = df['col'].str.split('[+|-]', expand=True)

df.head()
       col left right
0      1+2    1     2
1      3+4    3     4
2       20   20  None
3  0.6+1.6  0.6   1.6
...