DataFrame列表列求最小值遇TypeError错误的解决方法
问题:计算DataFrame列表列的最小值(处理NaN值)
我创建了一个包含Lists列的DataFrame,该列元素为列表,无值时为NaN:
import pandas as pd df = pd.DataFrame(columns=['Lists', 'Min']) df['Lists'] = [ [1,2,3], [4,5,6], [7,8,9], float('NaN') ] print(df)
期望为Min列填入对应行列表的最小值,得到结果:
Lists Min 0 [1, 2, 3] 1 1 [4, 5, 6] 4 2 [7, 8, 9] 7 3 NaN NaN
但使用列表推导式df['Min'] = [min(x) for x in df.Lists.tolist()]时,出现TypeError: 'float' object is not iterable错误,该如何实现需求?
错误原因
当遍历到NaN值时,x是float类型,调用min(x)会尝试迭代该float对象,导致报错。核心是需要先判断元素是否为有效列表,再执行最小值计算。
解决方案
方法1:修改列表推导式,增加判断逻辑
直接在列表推导式中加入类型或非空判断,跳过NaN行的计算:
df['Min'] = [min(x) if isinstance(x, list) else float('NaN') for x in df['Lists']]
或者用pandas的缺失值判断函数:
df['Min'] = [min(x) if pd.notna(x) else float('NaN') for x in df['Lists']]
方法2:使用apply方法简化处理
借助pandas的apply方法,配合lambda函数逐行处理:
df['Min'] = df['Lists'].apply(lambda x: min(x) if isinstance(x, list) else pd.NA)
这里使用pd.NA更贴合pandas的缺失值规范,效果和float('NaN')一致但语义更清晰。
方法3:explode+groupby(适合多统计场景)
如果需要对列表做更多统计操作(比如同时算最大、均值),可以先展开列表再分组聚合:
# 展开列表并保留原索引 expanded_df = df['Lists'].explode().reset_index() # 按原索引分组计算最小值 min_values = expanded_df.groupby('index')['Lists'].min() # 将结果合并回原DataFrame df['Min'] = min_values
这种方法会自动将原NaN行的Min设为NaN,无需额外判断。
内容的提问来源于stack exchange,提问作者edge-case
相关产品推荐
相关产品推荐

