🚀 AI 一键生成 joinquant 策略代码

Python 列表中如何删除 NaN 并求均值?

joinquant | 发布时间: 2026/5/20
以下内容由 EasyQuant 生成。

问题描述

计算结果list中结果有nan,请问如何删除nan并求list中实数值的均值?????

计算结果list中结果有nan,请问如何删除nan并求list中实数值的均值?????

list长度事先不能确定。

可以转换数据类型为DataFrame等。

解决方案

在量化交易的数据处理中,经常会遇到计算结果列表中包含 nan(Not a Number)的情况。要删除 nan 并求剩余实数值的均值,有几种非常简便的方法。由于您提到可以转换数据类型,推荐使用 numpypandas,它们在处理这类问题时非常高效。

以下是三种常用的方法:

方法一:使用 numpy.nanmean(推荐,最简单高效)

numpy 提供了一个专门用于计算包含 nan 的数组均值的函数 nanmean,它会自动忽略 nan 值。

import numpy as np

# 假设这是您的列表
data_list = [1.0, 2.5, np.nan, 4.0, np.nan, 5.5]

# 直接使用 np.nanmean 求均值
mean_value = np.nanmean(data_list)

print("均值为:", mean_value)

方法二:转换为 pandas.Series

正如您所说,可以转换为 pandas 的数据结构。pandas.Seriesmean() 方法默认会跳过 nan 值(skipna=True)。

import pandas as pd
import numpy as np

# 假设这是您的列表
data_list = [1.0, 2.5, np.nan, 4.0, np.nan, 5.5]

# 转换为 Series
s = pd.Series(data_list)

# 求均值,默认自动忽略 NaN
mean_value = s.mean()

# 如果您确实需要一个没有 NaN 的新列表,可以使用 dropna()
# clean_list = s.dropna().tolist()

print("均值为:", mean_value)

方法三:使用纯 Python 列表推导式过滤

如果您不想依赖外部库,可以使用 math.isnan 过滤掉 nan,然后再求均值。

import math

# 假设这是您的列表 (这里用 float('nan') 模拟)
data_list = [1.0, 2.5, float('nan'), 4.0, float('nan'), 5.5]

# 过滤掉 nan
clean_list = [x for x in data_list if not math.isnan(x)]

# 求均值
if len(clean_list) > 0:
    mean_value = sum(clean_list) / len(clean_list)
else:
    mean_value = float('nan') # 如果全都是 nan,避免除以 0 报错

print("过滤后的列表:", clean_list)
print("均值为:", mean_value)

总结

在 JoinQuant 等量化平台中,通常已经内置了 numpypandas强烈推荐使用方法一(np.nanmean)或方法二(pd.Series.mean,因为它们不仅代码简洁,而且底层经过 C 语言优化,计算速度远快于纯 Python 的循环,特别是在列表长度较大时优势明显。