理解pandas中结合lambda使用assign方法做列字符串拼接的非预期表现
代码执行逻辑与结果偏差原因
测试环境与初始数据
- 运行环境:Python 3.8.5、pandas 1.2.1
- 初始DataFrame创建代码:
df = pd.DataFrame({'x' : [1,2], 'y' : [3,4]})
错误实现的实际执行流程
目标实现代码:
df.assign(c = lambda d: str(d['x']) + str(d['y']))
代码运行结果和预期存在偏差,核心原因是对pandas对象的操作逻辑理解偏差,实际执行流程如下:
assign方法传入lambda表达式的参数d为当前操作的完整DataFrame实例,代码中d['x']、d['y']均为完整的列对象(pandas Series类型),并非逐行索引得到的单元格值。- Python内置
str()方法的作用是将传入的对象整体转换为可打印的字符串描述。将该方法直接作用在Series对象上时,并不会遍历序列内的元素逐个做字符串转换,而是输出该Series对象的完整文本信息,例如对x列执行str(d['x']),会得到内容为"0 1\n1 2\nName: x, dtype: int64"的普通Python字符串,而非列内元素组成的字符串序列。 - 上述两个Series对象的文本描述字符串做加法拼接后,得到一个普通标量字符串。
assign方法识别到该返回值为标量类型时,会自动将该值广播填充到新列c的所有行,最终c列每一行的内容都是这个拼接生成的、描述两列属性的长字符串,而非逐行计算的单元格拼接结果。
偏差核心本质
预期实现逻辑为逐行读取x、y列的单元格值,逐个转为字符串后拼接,让新列每一行对应独立的计算结果;但实际代码的执行逻辑是将两个完整列对象整体转为描述文本,拼接成单个固定标量值后广播填充整列,最终结果自然和预期的['13', '24']不一致。
正确实现参考
- 逐元素类型转换后拼接:
df.assign(c = lambda d: d['x'].astype(str) + d['y'].astype(str))
- 逐元素映射转字符串后拼接:
df.assign(c = lambda d: d['x'].map(str) + d['y'].map(str))
内容的提问来源于stack exchange,提问作者Srivatsa Srinath
相关产品推荐
相关产品推荐

