为了账号安全,请及时绑定邮箱和手机立即绑定

仅计算数据框中没有 NaN 值的数据行的平均值

仅计算数据框中没有 NaN 值的数据行的平均值

BIG阳 2022-11-09 16:52:54
我有一个包含客户 ID 及其 2014-2018 年费用的数据框。我想要的是数据框中每个 ID 的 2014-2018 年费用的平均值。但是有一个条件:如果行(2014-2018)中的一个单元格为空,则应返回 NaN。所以我只希望在 2014-2018 列中的所有 5 个行单元格都具有数值时计算平均值。初始数据框:2014   2015  2016  2017   2018   ID100  122.0   324   632    NaN  12.0120  159.0    54   452  541.0  96.0NaN  164.0   687   165  245.0  20.0180  421.0   512   184  953.0  73.0110  654.0   913   173  103.0  84.0130    NaN   754   124  207.0  26.0170  256.0   843    97  806.0  87.0140  754.0    95   101  541.0  64.0 80  985.0   184    84   90.0  11.0 96   65.0   127   130  421.0  34.0期望的输出2014   2015  2016  2017   2018    ID    mean 100  122.0   324   632    NaN  12.0     NaN 120  159.0    54   452  541.0  96.0  265.20 NaN  164.0   687   165  245.0  20.0     NaN 180  421.0   512   184  953.0  73.0  450.00 110  654.0   913   173  103.0  84.0  390.60 130    NaN   754   124  207.0  26.0     NaN 170  256.0   843    97  806.0  87.0  434.40 140  754.0    95   101  541.0  64.0  326.20  80  985.0   184    84   90.0  11.0  284.60  96   65.0   127   130  421.0  34.0  167.80尝试过的代码: -> 然而,这只是给了我平均值,忽略了 NaN 条件。他们是否有一些简短的 lambda 函数可以将条件添加到代码中?import pandas as pd
import numpy as np

data = pd.DataFrame({"ID":   [12,96,20,73,84,26,87,64,11,34],
                                        "2014": [100,120,np.nan,180,110,130,170,140,80,96],
                                        "2015": [122,159,164,421,654,np.nan,256,754,985,65],
                   "2016": [324,54,687,512,913,754,843,95,184,127],
                      "2017": [632,452,165,184,173,124,97,101,84,130],
                    "2018": [np.nan,541,245,953,103,207,806,541,90,421]})

print(data)

fiveyear = ["2014", "2015", "2016", "2017", "2018"] -> if a cell in these rows is empty(NaN), then NaN should be in the new 'mean'-column. I only want the mean when, all 5 cells in the row have a numeric value.

data.loc[:, 'mean'] = data[fiveyear].mean(axis=1)

print(data)
查看完整描述

2 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

用于dropna在计算平均值之前删除行。因为pandas在分配结果时会在索引上对齐,并且这些行被删除了,这些删除行的结果是NaN

df['mean'] = df[fiveyear].dropna(how='any').mean(1)

也可能mask只对那些非空的行产生结果

df['mean'] = df[fiveyear].mean(1).mask(df[fiveyear].isnull().any(1))

有点 hack,但是因为你知道你需要所有 5 个值,你也可以使用sum它来支持这个min_count参数,所以任何少于 5 个值的值都是NaN

df['mean'] = df[fiveyear].sum(1, min_count=len(fiveyear))/len(fiveyear)


查看完整回答
反对 回复 2022-11-09
?
杨魅力

TA贡献1811条经验 获得超5个赞

这与@ALollz 答案相同,但无论 df 中有多少年,都可以灵活地检测所有列


#get years columns in a list

yearsCols= [c for c in df if c != 'ID']


#calculate mean

df['mean'] = df[yearsCols].dropna(how='any').mean(1)


查看完整回答
反对 回复 2022-11-09
  • 2 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信