![](/img/trans.png)
[英]Elegant way to replace values in pandas.DataFrame from another DataFrame
[英]Conditionally replace values in pandas.DataFrame with previous value
我需要过滤数据集中的异常值。 在我的应用程序中,用列中的先前值替换异常值最有意义。
使用可用的pandas
工具很难做到这一点(主要是与切片上的副本或设置为NaN
时发生的类型转换有关)。
有没有一种快速和/或内存有效的方法来做到这一点? (请参阅下面有关我当前使用的解决方案的回答,该解决方案也有局限性。)
一个简单的例子:
>>> import pandas as pd
>>> df = pd.DataFrame({'A':[1,2,3,4,1000,6,7,8],'B':list('abcdefgh')})
>>> df
A B
0 1 a
1 2 b
2 3 c
3 4 d
4 1000 e # '1000 e' --> '4 e'
5 6 f
6 7 g
7 8 h
您可以简单地屏蔽超过阈值的值并使用ffill
:
df.assign(A=df.A.mask(df.A.gt(10)).ffill())
A B
0 1.0 a
1 2.0 b
2 3.0 c
3 4.0 d
4 4.0 e
5 6.0 f
6 7.0 g
7 8.0 h
使用mask
是必要的,而不是shift
东西,因为它可以确保在先前值也高于阈值的情况下输出非离群值。
我先通过转换为numpy
数组,然后在该处执行操作,然后重新插入该列,来规避了有关pandas
副本和切片的一些问题。 我不确定,但是据我所知,一旦将其放回pandas.DataFrame
,数据类型便是相同的。
def df_replace_with_previous(df,col,maskfunc,inplace=False):
arr = np.array(df[col])
mask = maskfunc(arr)
arr[ mask ] = arr[ list(mask)[1:]+[False] ]
if inplace:
df[col] = arr
return
else:
df2 = df.copy()
df2[col] = arr
return df2
这将创建一个掩码,将其向下移动一个,以使True
值指向上一个条目,并更新数组。 当然,如果有多个相邻的离群值,则需要递归运行(如果有N个连续的离群值,则需要N次),这是不理想的。
在OP中给出的用法:
df_replace_with_previous(df,'A',lambda x:x>10,False)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.