我想合并两个int列来创建一个新的点分隔str列。我有一个办法,但如果有一个更快的办法,它会有帮助。我还尝试了另一个答案中的一个建议,这样会产生一个错误。
这是有效的:

df3 = pd.DataFrame({'job_number': [3913291, 3887250, 3913041],
                   'task_number': [38544, 0, 1]})
df3['filename'] = df3['job_number'].astype(str) + '.' + df3['task_number'].astype(str)

0    3913291.38544
1    3887250.0
2    3913041.1

This answer对于类似的问题,使用.values.astype(str)提出了一种“numpy”方式,但我还没有开始工作。在这里,我运行它而不包括点分隔符:
df3['job_number'].values.astype(int).astype(str) + df3['task_number'].astype(int).astype(str)

0    391329138544
1    38872500
2    39130411

但是当我包含点分隔符时,我会得到一个错误:
df3['job_number'].values.astype(int).astype(str) + '.' + df3['task_number'].astype(int).astype(str)

TypeError: ufunc 'add' did not contain a loop with signature matching types dtype('<U11') dtype('<U11') dtype('<U11')

我想要的结果是:
0    3913291.38544
1    3887250.0
2    3913041.1

最佳答案

有关给定方法与其他可用方法的比较,请参阅@Jezrael answer。
方法1
若要添加包含.的虚拟列,请在处理中使用它,然后删除它:

%%timeit
df3['dummy'] ='.'
res = df3['job_number'].values.astype(str) + df3['dummy'] + df3['task_number'].values.astype(str)
df3.drop(columns=['dummy'], inplace=True)

1.31 ms ± 41.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

对于方法1的扩展,如果排除了伪列创建的处理时间并将其删除,则获得的最佳结果是-
%%timeit
df3['job_number'].values.astype(str) + df3['dummy'] + df3['task_number'].values.astype(str)

286 µs ± 15.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

方法2
使用apply
%timeit df3.T.apply(lambda x: str(x[0]) + '.' + str(x[1]))

883 µs ± 22 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

关于python - 有没有一种更快的(numpy?)方式将pandas df int列组合成点分隔的str col,而没有TypeError,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54966783/

10-12 18:37