pandas如何用.mean(axis=1)得到含NaN值的目标行均值
问题背景
现有基于numpy、pandas编写的测试代码,构建的DataFrame中2021列存在np.NaN空值,通过两种不同逻辑计算行均值,代码如下:
import numpy as np import pandas as pd GFG_dict = { '2019': [10,20,30,40],'2020': [20,30,40,50],'2021': [30, np.NaN, np.NaN, 60],'2022':[40,50,60,70]} gfg = pd.DataFrame(GFG_dict) gfg['mean1'] = gfg.mean(axis = 1) gfg['mean2'] = gfg.loc[:,'2019':'2022'].sum(axis = 1)/4 gfg
两种均值的计算逻辑差异:
mean1:调用默认参数的.mean(axis=1)计算,运行时自动跳过NaN值,以每行非空值的数量作为分母求平均mean2:对2019-2022列按行求和后除以固定列数4,空值不参与分子求和,分母固定为总列数
需求为直接使用.mean(axis=1)方法得到与mean2列完全一致的计算结果。
实现方法
pandas默认的.mean(axis=1)会自动跳过NaN值,分母取每行实际非空的数值个数,因此和固定除以4的mean2结果存在差异。
要直接用.mean(axis=1)得到和mean2完全一致的结果,只需要在计算均值前将目标列范围内的NaN填充为0再计算即可。NaN被替换为0后不会改变分子求和结果,同时每行所有列都计为非空,分母自然固定为4,和sum(axis=1)/4的逻辑完全等价。
实现代码如下:
# 仅针对2019-2022列范围计算,空值填充为0后求行均值 gfg['mean3'] = gfg.loc[:, '2019':'2022'].fillna(0).mean(axis=1)
运行后可验证结果完全匹配:
- 索引1行数值为20、30、NaN、50,填0后求和为100,除以4得25,和
mean2结果一致 - 索引2行数值为30、40、NaN、60,填0后求和为130,除以4得32.5,和
mean2结果一致 - 其余无空值的行,填充0不影响计算结果,和
mean2完全相同
内容的提问来源于stack exchange,提问作者user16490995
相关产品推荐
相关产品推荐

