我想合并两个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
按
%%timeit
结果排序的方法我对所有建议的方法进行了计时,并在两个数据帧上对更多的方法进行了计时。以下是建议方法的计时结果(谢谢@meW和@jezrael)。如果我错过了任何一个或你有另一个,让我知道,我会添加它。你知道吗
每个方法显示两个计时:首先处理示例df中的3行,然后处理另一个df中的57K行。其他系统的计时可能不同。在连接字符串中包含
TEST['dot']
的解决方案需要在df中使用此列:用TEST['dot'] = '.'
添加它。你知道吗原始方法(仍然是最快的):
.astype(str),+,'..'.
建议的方法和一些排列:
.astype(int).astype(str),+,'..'.
。值.astype(int).astype(str),+,TEST['dot']
。值.astype(str),+,测试['dot']
'.'.join(),列表理解。值.astype(str)
f-string,列表理解。值.astype(str)
.join(),zip,列表理解,.map(str)
应用(lambda,str(x[2]),+,'.')
如果你发现了一个改进的方法,请告诉我,我会添加到列表中!你知道吗
您可以使用列表理解:
如果使用Python3.6+和
f-string
的最快解决方案:30000行的性能:
但最快的解决方案是:
稍加修改-使用
map
代替astype
:有关给定方法与其他可用方法的比较,请参阅@Jezrael answer。你知道吗
方法1
要添加包含
.
的伪列,请在处理中使用它,然后删除它:对于方法1的扩展,如果排除创建伪列的处理时间并将其删除,则得到的最佳结果是-
方法2
使用
apply
相关问题 更多 >
编程相关推荐