我试图根据一个大的数组中特定列的所有原始元素的前3个字符来替换数组中的整个元素(在适用的情况下,基于字典)。这个过程需要重复多次。考虑到有超过20,000个选定的列,下面的for循环非常慢。
请注意,其中的所有元素都是字符串。
d = {'0/0': 0, '0/1': 1, '1/0': 1, '1/1': 2, "./.": 3}
cols = list(set(merged.columns) - set(["subject", "Group"]))
for col in cols:
merged[col] = merged[col].str[:3].replace(d)
字符串
我尝试使用lamda函数(请参阅下文),然而,这也很慢。我相信是apply函数减慢了速度。(注意:使用Applymap也很慢)
d = {'0/0': 0, '0/1': 1, '1/0': 1, '1/1': 2, "./.": 3}
cols = list(set(merged.columns) - set(["subject", "Group"]))
merged[cols] = merged[cols].apply(lambda x: x.str[:3].replace(d))
型
我正在寻求更有效的方法,例如使用矢量化,但未能确定前进的方向。
下面可以看到数据的示例(请注意,它比实际数据小得多,每个单元格中的字符串也长得多)
data = {
'Sample1': ['0/0:0,1:33', '0/1:2,3:32', '1/0:4,5', '1/1:6,7', './.:8,9'],
'Sample2': ['0/0:10,11', '0/1:12,13', '1/0:14,15', '1/1:16,17', './.:18,19'],
'Sample3': ['0/0:20,21', '0/1:22,23', '1/0:24,25:23', '1/1:26,27', './.:28,29'],
}
df = pd.DataFrame(data)
型
更新:具有代表性大小的数据样本
import numpy as np
import pandas as pd
sample = ['0/0:0,1:33', '0/1:2,3:32', '1/0:4,5', '1/1:6,7', './.:8,9', '0/0:10,11',
'0/1:12,13', '1/0:14,15', '1/1:16,17', './.:18,19', '0/4:20,21',
'0/1:22,23', '1/0:24,25:23', '1/1:26,27', './.:28,29']
df = pd.DataFrame(np.random.choice(sample, (2000, 20000)))
型
5条答案
按热度按时间jpfvwuh41#
示例
让我们做2000 X 20000样品
字符串
的数据
验证码
生成Map程序
型
我认为使用for循环和使用
apply
之间没有太大的区别,因为它们都是循环。但是,
map
比replace
快一点(注意,未Map的结果返回NaN),并且apply
的axis=1更有效,因为列比行多。型
结果:
型
1.轴为0的贴图(默认)
型
结果:
型
1.轴=1的Map
型
结果:
型
有可能获得稍微更有效的结果
c86crjj02#
这个怎么样,使用
numpy
的<U3
类型快速提取前三个字符?在一个2000 x 20_000
帧上需要6. 22秒(AWSr6id.2xlarge
)。字符串
测试,一些单元格故意不匹配(输出将是
default
):型
相比之下:
PaulS的解决方案:
型
(One Panda Kim的解决方案:
型
.注意,这填充了NaN,其中
d
中没有匹配项,因此使帧dtype=float64
。n1bvdmb63#
解决方案1(最快)
到目前为止找到的最快的解决方案(它只需要
3.27s
,(2000, 20000)
维的嵌套框架),它基于获取每个嵌套框架元素(S3
dtype)的前3个字节,然后使用嵌套的np.where
和比较字节的想法:字符串
性能:
3.27 s ± 30.2 ms/循环(7次运行的平均值±标准差,每次1个循环)
解决方案2
另一种可能的解决方案,基于
numpy.vectorize
:型
性能:
更快的已知解决方案之前,我的解决方案是@PierreD的一个.与此相比,我的解决方案(在我的机器上,
(2000, 20000)
尺寸的矩阵):7.31 s ± 70.8 ms/循环(7次运行的平均值±标准差,每次1个循环)
9.55 s ± 66.9 ms/循环(7次运行的平均值±标准差,每次1个循环)
解决方案3
或者:
型
输出量:
型
mm5n2pyu4#
**根据示例更新:
字符串
jum4pzuy5#
我将添加一个基准测试,允许在相同的调用中轻松测试所有函数(并使用相同大小的框架):
字符串
如果你有多核计算机,你应该看看dask。你可以这样做:
型
以下是我使用不同方法的结果:
型
如果您使用的是Pierre D解决方案,那么将有更多的工作来调整解决方案以适应dask。