在数据帧上迭代 re.split()
Posted
技术标签:
【中文标题】在数据帧上迭代 re.split()【英文标题】:iterating re.split() on a dataframe 【发布时间】:2019-04-23 10:36:06 【问题描述】:我正在尝试使用 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 循环更好的方法,我会非常感兴趣。
【问题讨论】:
how to split column of tuples in pandas dataframe?的可能重复 【参考方案1】:使用带有 expand 参数的 str.split 方法从这个答案中借用: https://***.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
【讨论】:
这是一种比循环更好的方法,我认为您只能在单个分隔符上进行拆分。谢谢!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]
retention of sign 丢失...【参考方案2】:
这可能是你想要的。不确定它是否优雅,但应该比 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)
【讨论】:
【参考方案3】:要保留的正则表达式 - 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]
【讨论】:
以上是关于在数据帧上迭代 re.split()的主要内容,如果未能解决你的问题,请参考以下文章