Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫-用特定组的平均值替换列中的南_Python_Pandas_Dataframe - Fatal编程技术网

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,您会感激吗?当然,我已经投了赞成票(抱歉,我不知道我可以投赞成票)。谢谢你的帮助!