我有一个数据集看起来像这样:
import pandas as pd
data = {'stringID':['AB CD Efdadasfd','RFDS EDSfdsadf dsa','FDSADFDSADFFDSA']}
data = pd.DataFrame(data)
data['Index1'] = [[3,6],[7,9],[5,6]]
data['Index2'] = [[4,8],[10,13],[8,9]]
我根据Index1和Index2(均为列表)中的值计算了容量,当时我正在使用索引从stringID列中切片子字符串。目前这是我的计算结果:
data['Value1'] = [data['stringID'][i][data['Index1'][i][0]:data['Index2'][i][0]] for i in range(0,len(data['stringID']))]
它可以工作,但是如果我遍历大型数据集,它会非常慢。有什么更好的方法呢?谢谢!
编辑:
正如您所说的,您的真实数据集有3列以上,您只需要对3列进行切片就可以得到numpy nd-array,如下所示:
data['Value1'] = [x[y[0]:z[0]] for x, y, z
in data[['stringID','Index1','Index2']].to_numpy()]
您无法避免循环。但是,您可以使用numpy nd-array作为源来简化列表理解,例如,
data['Value1'] = [x[y[0]:z[0]] for x,y,z in data.to_numpy()]
30万行的时间:
data = pd.concat([data]*100000, ignore_index=True)
In [1380]: %timeit [x[y[0]:z[0]] for x,y,z in data.to_numpy()]
617 ms ± 24.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [1382]: %timeit [data['stringID'][i][data['Index1'][i][0]:data['Index2'][i][0]] for i in range(0,len(data['stringID']))]
11.3 s ± 320 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
因此,它比您的解决方案快18倍。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句