pandas.Series.apply返回None却成功修改原Series的问题咨询
问题原因
- 集合的
add()方法是原地修改集合本身,执行后返回值固定为None。apply()会把lambda的返回值组装成新的Series,所以最终得到的结果全是None。 - pandas Series里的集合属于可变对象,lambda里直接调用
set_.add(2)会直接修改原Series中存储的集合引用,所以原Series的元素确实会被成功修改。
正确处理方式
分两种使用场景:
场景1:仅需修改原Series,不需要生成新Series
直接遍历Series元素修改即可,没必要用apply(),写法更直观:
for s in epitope_charge_detail: s.add(2)
场景2:保留原Series,生成包含修改后集合的新Series
必须先复制原集合,再添加元素,避免改动原数据:
# 简洁写法 new_epitope_charge = epitope_charge_detail.apply(lambda s: (lambda x: x.add(2) or x)(set(s))) # 更易读的函数写法 def add_element(s): new_set = set(s) new_set.add(2) return new_set new_epitope_charge = epitope_charge_detail.apply(add_element)
这里用set(s)复制原集合,修改新集合后返回,原Series的元素不会被改动,新Series里是更新后的集合。
内容的提问来源于stack exchange,提问作者FluidMechanics Potential Flows
相关产品推荐
相关产品推荐

