用lambda函数为DataFrame新增列失败:值为函数对象问题排查
问题分析与解决方案
嘿,我来帮你揪出问题所在!你的代码之所以新增列里全是函数对象,而非预期的百分比数值,主要有这几个关键问题:
- 完全没必要用for循环:Pandas天生就是为矢量化操作设计的,直接对整列进行计算就行,循环不仅多余,还容易引入不必要的错误。
- 直接赋值lambda函数=存函数而非结果:你把
lambda x: ...直接赋值给'% van totaal'列,这相当于给每一行都塞了一个未执行的函数,而不是运行这个函数得到的数值。lambda在这里只是一个函数定义,没有被调用计算。 - 变量名不一致:代码里写了
df['totaal 2016'],但你的DataFrame明明叫lijst_df,这里的变量名写错啦。
正确的写法(高效简洁)
你可以直接抛弃循环,用Pandas的矢量化操作一步搞定,这也是最推荐的方式:
# 先计算"totaal 2016"列的总和,只算一次就够了 total_2016 = lijst_df['totaal 2016'].sum() # 整列计算百分比,自动匹配每一行的数值 lijst_df['% van totaal'] = (lijst_df['totaal 2016'] / total_2016) * 100
如果想让百分比结果更美观(比如保留两位小数),可以再加一行:
lijst_df['% van totaal'] = lijst_df['% van totaal'].round(2)
如果你非要用lambda(不推荐,但可以了解)
如果坚持想用lambda,你需要用apply方法去逐行调用它(但效率不如整列运算):
total_2016 = lijst_df['totaal 2016'].sum() lijst_df['% van totaal'] = lijst_df['totaal 2016'].apply(lambda x: (x / total_2016) * 100)
记住,Pandas的核心优势就是矢量化批量操作,能不用循环就不用循环哦!
内容的提问来源于stack exchange,提问作者Janneman
相关产品推荐
相关产品推荐

