为何pd.Series.map使用lambda函数无法得到预期结果?
问题解析:Pandas Series.map中两种写法的差异
先看测试代码:
import pandas as pd s = (["A", "b"], ["c", "e"]) test_series = pd.Series(data=s)
为什么test_series.map('|'.join)能正常工作?
'|'.join是绑定了字符串'|'的内置方法,当传给map时,Pandas会自动将Series中的每个元素(即每个列表)作为参数传递给这个方法,等价于对每个元素执行:
'|'.join(element)
因此最终得到拼接后的字符串结果。
为什么test_series.map(lambda x: '|'.join)返回方法对象?
你写的这个lambda函数lambda x: '|'.join,仅接收参数x但没有调用join方法——它返回的是'|'.join这个方法对象本身,而非执行join(x)的结果。所以map遍历每个元素时,只是把方法对象返回,最终Series里存的就是这些方法的引用。
正确的lambda写法应该把x作为参数传给join:
test_series.map(lambda x: '|'.join(x))
这样就能得到和map('|'.join)一致的结果:
0 A|b 1 c|e dtype: object
关于你提到的类型差异
你注意到type('|'.join)是builtin_function_or_method,type(lambda x: '|'.join)是function,但这不是问题核心。核心是lambda函数的逻辑错误——没有执行方法调用,只是返回了方法本身。哪怕是自定义函数,只要写法正确也能正常工作,比如:
def join_with_pipe(x): return '|'.join(x) test_series.map(join_with_pipe)
同样会得到正确的拼接结果。
内容的提问来源于stack exchange,提问作者user37292
相关产品推荐
相关产品推荐

