如何计算鸢尾花数据集各物种的花萼/花瓣长度范围及解决代码报错
鸢尾花数据集物种长度范围计算:报错修复与实现方案
报错原因
出现TypeError: 'method' object is not iterable的直接原因是df.species.unique是pandas的方法对象,没有加括号调用,正确写法应为df.species.unique(),这样才会返回可迭代的物种数组。
除此之外,原函数逻辑完全不匹配需求:
- 仅硬编码处理
setosa物种,没有遍历所有物种; - 函数参数
species和length未实际用于分组计算,逻辑混乱。
修复并实现需求的方法
方法一:修复自定义函数
以下是修正后的函数,可遍历所有物种,计算指定4列的最小值、最大值和极差:
import pandas as pd # 假设df是已加载的鸢尾花数据集(需确保列名与需求一致:SPECIES、SEPAL_LENGTH等) def calculate_species_range(df): result = {} # 获取所有唯一物种,调用unique()方法 for species in df['SPECIES'].unique(): # 筛选当前物种的所有数据 species_data = df[df['SPECIES'] == species] # 计算4列的统计值 col_stats = {} for col in ['SEPAL_LENGTH', 'SEPAL_WIDTH', 'PETAL_LENGTH', 'PETAL_WIDTH']: min_val = species_data[col].min() max_val = species_data[col].max() range_val = max_val - min_val col_stats[col] = {'最小值': min_val, '最大值': max_val, '极差': range_val} result[species] = col_stats return result # 调用函数并打印结果 species_range = calculate_species_range(df) for sp, stats in species_range.items(): print(f"物种:{sp}") for col, vals in stats.items(): print(f" {col}: 最小值={vals['最小值']}, 最大值={vals['最大值']}, 极差={vals['极差']}")
方法二:用Pandas内置方法高效实现
利用groupby结合agg可以更简洁地完成计算,无需手动遍历:
# 定义聚合函数:对每个列计算min、max、极差 aggregations = { col: ['min', 'max', lambda x: x.max() - x.min()] for col in ['SEPAL_LENGTH', 'SEPAL_WIDTH', 'PETAL_LENGTH', 'PETAL_WIDTH'] } # 按物种分组并聚合 result_df = df.groupby('SPECIES').agg(aggregations) # 扁平化列名,让结果更易读 result_df.columns = ['_'.join([col, stat]) for col, stat in result_df.columns] # 输出结果 print(result_df)
方法三:自定义聚合列名的简洁写法
如果需要更清晰的列名,可以这样写:
agg_funcs = { col: [ ('最小值', 'min'), ('最大值', 'max'), ('极差', lambda x: x.max() - x.min()) ] for col in ['SEPAL_LENGTH', 'SEPAL_WIDTH', 'PETAL_LENGTH', 'PETAL_WIDTH'] } result_df = df.groupby('SPECIES').agg(agg_funcs) # 扁平化多级列名 result_df.columns = ['_'.join(col) for col in result_df.columns] print(result_df)
内容的提问来源于stack exchange,提问作者Pranav167
相关产品推荐
相关产品推荐

