如何对Pandas DataFrame中字符串格式的数字列表列进行求和操作?
问题解答
1. 为什么apply看起来传入了整列数据而非单个单元格?
- 实际上
pd.Series.apply默认就是逐元素调用函数,不存在传入整列的情况,你调试时的错觉来源于NaN值的类型特性:原Charges列存在空值(最后一行为NaN),而str.findall方法碰到NaN值时不会返回空列表,会直接返回原始的NaN(本身属于float类型)。当函数尝试遍历这个float类型的NaN时,就抛出了'float' object is not iterable的错误,你误以为传入的是整列,实际只是传入了单个NaN值而已。
2. 空值的最优处理方案
不需要提前用fillna(0)修改原列,直接在自定义函数里做类型判断即可,对业务逻辑的侵入性更低:
def charge_sum(charge_list): # 仅列表类型为有效提取结果,其他情况直接返回对应值即可 if not isinstance(charge_list, list): return 0 return sum(float(num) for num in charge_list) df['Summed Charges'] = df['Charges'].apply(charge_sum)
如果业务上要求空值对应的汇总列也保留空标记而非填0,只需要把返回值改成pd.NA即可:
import pandas as pd def charge_sum(charge_list): if not isinstance(charge_list, list): return pd.NA return sum(float(num) for num in charge_list)
如果不想写独立的自定义函数,也可以用lambda表达式简化写法:
df['Summed Charges'] = df['Charges'].apply(lambda x: sum(map(float, x)) if isinstance(x, list) else 0)
内容的提问来源于stack exchange,提问作者saujosai
相关产品推荐
相关产品推荐

