gpt4 book ai didi

python - 在 Pandas 中用 groupby 均值替换基于多个条件的值

转载 作者:行者123 更新时间:2023-12-01 00:24:26 69 4
gpt4 key购买 nike

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

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', 'a', 'b', '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

我想替换大于0.2或小于-0.2pct值,然后用groupby 替换它们类型 平均值s。

我尝试通过以下方式解决此问题:首先,用额外值 -999 替换“异常值”,然后用 groupby 输出替换它们,这就是我所做的:

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

预期结果应如下所示:

        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 -1.130
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.24

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

最佳答案

相反,您的这两个条件都可以使用 Series.between并通过 GroupBy.transform 设置 pct 中的值与意思:

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'])

关于python - 在 Pandas 中用 groupby 均值替换基于多个条件的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58710697/

69 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com