Python Pandas DataFrame条件拼接字符串新建列报错及优化
错误原因
你的代码问题出在str(df.num)这一步:这个写法是把整个num列的Series对象整体转成字符串,得到的是整列的字符串化打印结果,不是逐行转换每个单元格的值,自然会把全列的索引、值、类型信息全拼到前缀后面。
百万行级数据最高效实现
不要用apply、iterrows这类逐行遍历的写法,这类纯Python层循环的性能在百万行场景下会比向量化操作低几十到上百倍。最优方案是用pandas原生向量化操作,只对符合条件的行做计算,最小化计算开销:
import pandas as pd import numpy as np # 样例数据构造 df = pd.DataFrame({'name':('Nick', 'Nick', 'Nick', 'David'), 'num':(1, 2, 3, 4)}) # 初始化link列为空字符串 df['link'] = '' # 筛选出name为Nick的行掩码 nick_mask = df['name'] == 'Nick' # 仅对符合条件的行做字符串拼接,全底层C实现无Python层循环 df.loc[nick_mask, 'link'] = 'https://' + df.loc[nick_mask, 'num'].astype(str)
方案说明
- 所有运算均为pandas向量化实现,百万行数据处理耗时通常在100毫秒以内,性能拉满
- 仅对满足条件的行做数值转字符串、拼接操作,不会对name不等于Nick的行做无用计算,内存和算力开销最低
- 如果习惯用
np.where也可以写对版本,但这个写法会对全列num做类型转换,性能略差于上面的loc方案,写法如下:df['link'] = np.where(df['name'] == 'Nick', 'https://' + df['num'].astype(str), '')
运行后得到的结果完全符合预期:
name num link 0 Nick 1 https://1 1 Nick 2 https://2 2 Nick 3 https://3 3 David 4
内容的提问来源于stack exchange,提问作者Nicholas
相关产品推荐
相关产品推荐

