如何编写支持单个数字、列表及Pandas DataFrame的均值计算函数?
跨多类型数据的均值计算函数实现
问题分析
你之前的函数仅支持单个数字输入,要扩展到列表、Pandas DataFrame等类型,核心是先将不同类型的输入统一转换为可计算的数值集合,而非误用**kwargs(**kwargs用于接收关键字参数,你的场景需要的是接收任意位置参数的*args)。
解决方案代码
import pandas as pd import numpy as np def mean(*args): all_values = [] for arg in args: # 处理单个整数/浮点数(含Numpy数值类型) if isinstance(arg, (int, float, np.number)): all_values.append(arg) # 处理列表、元组、Numpy数组 elif isinstance(arg, (list, tuple, np.ndarray)): # 过滤非数值元素 all_values.extend([x for x in arg if isinstance(x, (int, float, np.number))]) # 处理Pandas Series elif isinstance(arg, pd.Series): # 剔除空值后转换为列表 all_values.extend(arg.dropna().tolist()) # 处理Pandas DataFrame elif isinstance(arg, pd.DataFrame): # 仅保留数值列,扁平化后剔除空值 numeric_data = arg.select_dtypes(include=[np.number]).stack().dropna() all_values.extend(numeric_data.tolist()) else: raise TypeError(f"不支持的数据类型: {type(arg)}") if not all_values: raise ValueError("未提供有效数值") return sum(all_values) / len(all_values)
代码说明
- 参数接收:用
*args接收任意数量的位置参数,支持同时传入单个数字、列表、Series等混合类型。 - 类型适配:
- 单个数值直接加入计算集合
- 可迭代类型(列表/数组)过滤非数值后合并
- Pandas对象自动剔除空值,仅处理数值部分
- 异常处理:无有效数值或传入不支持类型时抛出明确错误,避免静默失败。
测试案例
# 单个数字输入 print(mean(1, 2, 3)) # 输出: 2.0 # 列表输入 print(mean([1, 2, 3, 4])) # 输出: 2.5 # Pandas Series(含空值) s = pd.Series([5, 6, np.nan, 7]) print(mean(s)) # 输出: 6.0 # Pandas DataFrame(含非数值列和空值) df = pd.DataFrame({ 'num1': [10, 20, np.nan], 'num2': [30, 40, 50], 'str_col': ['a', 'b', 'c'] }) print(mean(df)) # 输出: 30.0 # 混合类型输入 print(mean(1, [2,3], pd.Series([4,5]))) # 输出: 3.0
关于**kwargs报错的原因
**kwargs的作用是接收关键字参数(如mean(a=1, b=2)),而你的需求是传入位置参数(单个值、列表等),强行使用**kwargs会导致位置参数无法被解析,从而抛出参数不匹配的错误,改用*args即可解决这个问题。
内容的提问来源于stack exchange,提问作者Vice Strife
相关产品推荐
相关产品推荐

