Pandas - 用特定组的平均值替换列中的 NaN

Posted

技术标签:

【中文标题】Pandas - 用特定组的平均值替换列中的 NaN【英文标题】:Pandas - Replace NaNs in a column with the mean of specific group 【发布时间】:2020-01-16 12:14:55 【问题描述】:

我正在处理如下数据。数据框按日期排序:

category  value  Date
0         1      24/5/2019     
1         NaN    24/5/2019         
1         1      26/5/2019       
2         2      1/6/2019      
1         2      23/7/2019       
2         NaN    18/8/2019         
2         3      20/8/2019       
7         3      1/9/2019 
1         NaN    12/9/2019       
2         NaN      13/9/2019       

我想用该特定类别的先前平均值替换“NaN”值。

在 pandas 中最好的方法是什么?

我考虑过的一些方法:

1) 这个小片段:

   df['mean' = df.groupby('category')['time'].apply(lambda x: x.shift().expanding().mean()))

source

这让我在另一列中得到了正确的方法,它不会取代 NaN。

2) 此 riff 将 NaN 替换为列的平均值:

df = df.groupby(df.columns, axis = 1).transform(lambda x: x.fillna(x.mean()))

Source 2

这两个都不能完全满足我的要求。如果有人可以指导我,将不胜感激!

【问题讨论】:

“该特定类别的先前均值”到底是什么意思?因为类别的重复。 我的意思是,对于每个 NaN 值,查看相应的类别,找到该类别在所有先前日期中的平均值,然后用这个计算出的平均值替换 NaN。 df['value']=df['value'].fillna(df.groupby('category')['value'].transform(lambda x: x.shift().expanding().mean()))? 【参考方案1】:

您可以用shift + expanding + mean 的新系列替换value1 组的第一个值不会被替换,因为没有以前的NaN 值存在:

df['Date'] = pd.to_datetime(df['Date'])
s = df.groupby('category')['value'].apply(lambda x: x.shift().expanding().mean())
df['value'] = df['value'].fillna(s)
print (df)
   category  value       Date
0         0    1.0 2019-05-24
1         1    NaN 2019-05-24
2         1    1.0 2019-05-26
3         2    2.0 2019-01-06
4         1    2.0 2019-07-23
5         2    2.0 2019-08-18
6         2    3.0 2019-08-20
7         7    3.0 2019-01-09
8         1    1.5 2019-12-09
9         2    2.5 2019-09-13

【讨论】:

感谢这是一些很棒的 python 魔法。帮助我学习了一些做事的新方法。【参考方案2】:

您可以使用pandas.Series.fillna 替换 NaN 值:

df['value']=df['value'].fillna(df.groupby('category')['value'].transform(lambda x: x.shift().expanding().mean()))
print(df)

   category  value       Date
0         0    1.0  24/5/2019
1         1    NaN  24/5/2019
2         1    1.0  26/5/2019
3         2    2.0   1/6/2019
4         1    2.0  23/7/2019
5         2    2.0  18/8/2019
6         2    3.0  20/8/2019
7         7    3.0   1/9/2019
8         1    1.5  12/9/2019
9         2    2.5  13/9/2019

【讨论】:

感谢这是一个很好的方法,我在这里学到了一些新东西! 如果您对@ConvexLeopard 投了赞成票,您会感激不尽 当然,我已经投了赞成票(抱歉,我不知道我可以投赞成票)。感谢您的帮助!

以上是关于Pandas - 用特定组的平均值替换列中的 NaN的主要内容,如果未能解决你的问题,请参考以下文章

R:用向量中的项目替换NA

如何根据列组前缀替换列组的空白?

将列中的 NA 替换为相邻列中的值

替换因子列中的 <NA>

pandas使用replace函数将dataframe指定数据列中的特定字符串进行自定义替换(replace substring in dataframe column values)

将 DataFrame 中的 NA 替换为每个国家/地区的平均值