在数据帧上迭代re.split()



我正试图使用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编写它,或者使用列表理解或应用lambda,但我无法让它太运行。我认为我遇到的所有问题都是因为我试图将函数应用于整个系列,而不是位置值。

如果有人有一个比我的丑陋的for循环更好的方法的想法,我会非常感兴趣。

使用带有expand参数的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

这可能是您想要的。不确定它是否优雅,但应该比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) 

Regex保留-ve符号

import pandas as pd 
import re
df1 = pd.DataFrame({'col': ['1+2','3+4','20','0.6-1.6']})
data = [[i] + re.findall('-*[0-9.]+', i) for i in df1['col']]
df = pd.DataFrame(data, columns=["col", "left", "right"])
print(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
[Program finished]

最新更新