在熊猫中使用groupby mean替换基于多个条件的值

说我有一个数据框,如下所示:

df = pd.DataFrame({'date': pd.date_range(start='2013-01-01',periods=6,freq='M'),'value': [3,3.5,-5,2,7,6.8],'type': ['a','a','b','b']})
df['pct'] = df.groupby(['type'])['value'].pct_change()

输出:

        date  value type       pct
0 2013-01-31    3.0    a       NaN
1 2013-02-28    3.5    a  0.166667
2 2013-03-31   -5.0    a -2.428571
3 2013-04-30    2.0    b       NaN
4 2013-05-31    7.0    b  2.500000
5 2013-06-30    6.8    b -0.028571

我想替换大于pct或小于0.2的{​​{1}}值,然后将它们替换为groupby -0.2 type s。 / p>

我尝试通过以下方法解决此问题:首先,将“异常值”替换为附加值mean,然后将其替换为groupby输出,这就是我所做的:

-999

但是显然,这不是解决此问题的最佳解决方案,并且结果不正确:

df.loc[df['pct'] >= 0.2,'pct'] = -999
df.loc[df['pct'] <= -0.2,'pct'] = -999

df["pct"] = df.groupby(['type'])['pct'].transform(lambda x: x.replace(-999,x.mean()))

预期结果应如下所示:

        date  value type         pct
0 2013-01-31    3.0    a         NaN
1 2013-02-28    3.5    a    0.166667
2 2013-03-31   -5.0    a -499.416667
3 2013-04-30    2.0    b         NaN
4 2013-05-31    7.0    b -499.514286
5 2013-06-30    6.8    b   -0.028571

我做错了什么?再次感谢您的帮助。

FWBOOO 回答:在熊猫中使用groupby mean替换基于多个条件的值

相反,两种情况都可能使用Series.between并通过GroupBy.transformpctmean中设置值:

mask = df['pct'].between(-0.2,0.2)
df.loc[mask,'pct'] = df.groupby('type')['pct'].transform('mean').values
print (df)
        date  value type       pct
0 2013-01-31    3.0    a       NaN
1 2013-02-28    3.5    a -1.130952
2 2013-03-31   -5.0    a -2.428571
3 2013-04-30    2.0    b       NaN
4 2013-05-31    7.0    b  2.500000
5 2013-06-30    6.8    b  1.235714

替代解决方案是使用numpy.where

mask = df['pct'].between(-0.2,0.2)
df['pct'] = np.where(mask,df.groupby('type')['pct'].transform('mean'),df['pct'])
本文链接:https://www.f2er.com/3159924.html

大家都在问