如何在 pandas DataFrame 中忽略滚动平均值计算的 NaN 值?
Posted
技术标签:
【中文标题】如何在 pandas DataFrame 中忽略滚动平均值计算的 NaN 值?【英文标题】:How to ignore NaN values for a rolling mean calculation in pandas DataFrame? 【发布时间】:2022-01-07 06:27:55 【问题描述】:我尝试创建一个 DataFrame
,其中包含基于长度为 5 的窗口的滚动平均值。但我的数据包含一个 NaN
值,因此我只获得第 3 列的 NaN
值和 NaN
值.使用.rolling(5).mean()
时如何忽略NaN
值?
我有这个样本数据df1
:
Column1 Column2 Column3 Column4
0 1 5 -9.0 13
1 1 6 -10.0 15
2 3 7 -5.0 11
3 4 8 NaN 9
4 6 5 -2.0 8
5 2 8 0.0 10
6 3 8 -3.0 12
为了方便:
#create DataFrame with NaN
df1 = pd.DataFrame(
'Column1':[1, 1, 3, 4, 6, 2, 3],
'Column2':[5, 6, 7, 8, 5, 8, 8],
'Column3':[-9, -10, -5, 'NaN', -2, 0, -3],
'Column4':[13, 15, 11, 9, 8, 10, 12]
)
df1 = df1.replace('NaN',np.nan)
df1
当我使用基于 5 窗口创建滚动平均值时,我仅获得第 3 列的 NaN
值。
df2 = df1.rolling(5).mean()
Column1 Column2 Column3 Column4
0 NaN NaN NaN NaN
1 NaN NaN NaN NaN
2 NaN NaN NaN NaN
3 NaN NaN NaN NaN
4 3.0 6.2 NaN 11.2
5 3.2 6.8 NaN 10.6
6 3.6 7.2 NaN 10.0
【问题讨论】:
【参考方案1】:Pandas 的意思是有一个 skipna
标志被告知忽略 NaN 看到
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.mean.html
试试
df2 = df1.rolling(5).mean(skipna=True)
或
df2 = df1.rolling(5).apply(pd.np.nanmean)
【讨论】:
这仍然会导致 Column3 被 NaN 填充。此外,skipna
无论如何默认为 True
。
非常感谢您的回答。只有当我将上面的 'NaN' 更改为 'NA' 时,您的答案才有效。你知道这可能是什么原因吗?【参考方案2】:
您应该使用 0 或均值对 NaN 进行插值。
下面的作品。
df1 = df1.fillna(df1.mean())
df2 = df1.rolling(5).mean()
【讨论】:
感谢您的回答!就我而言,我不想插值。以上是关于如何在 pandas DataFrame 中忽略滚动平均值计算的 NaN 值?的主要内容,如果未能解决你的问题,请参考以下文章
pandas计算dataframe数据行的均值(mean)实战:设置skipna=False则计算行均值时不会忽略NaN值
一文速学-Pandas中DataFrame转换为时间格式数据与处理