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
的新系列替换value
,1
组的第一个值不会被替换,因为没有以前的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的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用replace函数将dataframe指定数据列中的特定字符串进行自定义替换(replace substring in dataframe column values)