Python 熊猫-用特定组的平均值替换列中的南
我正在处理如下数据。数据框按日期排序:Python 熊猫-用特定组的平均值替换列中的南,python,pandas,dataframe,Python,Pandas,Dataframe,我正在处理如下数据。数据框按日期排序: 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
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”值
在熊猫身上这样做的最佳方式是什么
我考虑的一些方法:
1) 这一小片段:
df['mean' = df.groupby('category')['time'].apply(lambda x: x.shift().expanding().mean()))
这在另一列中为我提供了正确的方法,但它并没有取代NAN
2) 此riff将NAN替换为列的平均值:
df = df.groupby(df.columns, axis = 1).transform(lambda x: x.fillna(x.mean()))
这两个都不能完全满足我的需求。如果有人能在这方面指导我,我将不胜感激 您可以从
shift
+扩展+mean
用新系列替换值
,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
可以使用替换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
你所说的“之前对特定类别的定义”到底是什么意思?因为类别是重复的。我的意思是,对于每个NaN值,查看相应的类别,找到该类别在所有以前日期的平均值,然后用计算出的平均值替换NaN。df['value']=df['value'].fillna(df.groupby('category')['value'].transform(lambda x:x.shift().expanding().mean())
?谢谢,这是一些很棒的python魔法。帮助我学会了一些新的做事方法。谢谢这是一个很好的方法,我在这里学到了一些新的东西!如果您投票赞成@ConvexLeopardSure,您会感激吗?当然,我已经投了赞成票(抱歉,我不知道我可以投赞成票)。谢谢你的帮助!