gpt4 book ai didi

python - 有没有更快的(numpy?)方法将 pandas df int 列组合成点分隔的 str col 而不出现 TypeError

转载 作者:行者123 更新时间:2023-11-28 21:33:13 25 4
gpt4 key购买 nike

我想组合两个 int 列来创建一个新的点分隔 str 列。我有一种可行的方法,但如果有更快的方法,那会有所帮助。我还尝试了在 SO 的另一个答案中找到的建议,该建议产生了错误。

这有效:

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对于类似的问题,建议使用“numpy”方式,使用 .values.astype(str),但我还没有让它工作。这里我运行它时不包含点分隔符:

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 答案。

方法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

使用应用

%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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com