我想合并两个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/