熊猫:用NaN替换数据帧的所有数字列中的离群值(3西格玛)
问题描述:
我有一个数据框和数字和字符串列。熊猫:用NaN替换数据帧的所有数字列中的离群值(3西格玛)
import numpy as np
import pandas as pd
from scipy.stats import zscore
data = {'c1' : [1., 2., 3., 4.], 'c2' : [4., 3., 2., 1.], 'c3' : [5., 6., 7000., 8.],
'c4' : [8., 7., 6., 10000.], 'c5' : ['a', 'b', 'c', 'd']}
我想用NaN替换数值列中的异常值。
c1 c2 c3 c4 c5
0 1.0 4.0 5.0 8.0 a
1 2.0 3.0 6.0 7.0 b
2 3.0 2.0 NaN 6.0 c
3 4.0 1.0 8.0 NaN d
此代码做我想做的事情。
df = pd.DataFrame(data)
allcol = list(df)
numcol = [x for x in allcol if x not in ('c5')]
df[numcol] = df[numcol].mask(~df[numcol].apply(lambda x: zscore(x) < 1.5, axis=1))
想知道,如果你知道任何更好的和简单的解决方案...
答
您可以设置 'C5' 入索引,然后使用:
df1 = df.set_index('c5')
df1.where(df1.apply(zscore).lt(1.5)).reset_index().reindex_axis(df.columns,1)
输出:
c1 c2 c3 c4 c5
0 1.0 4.0 5.0 8.0 a
1 2.0 3.0 6.0 7.0 b
2 3.0 2.0 NaN 6.0 c
3 4.0 1.0 8.0 NaN d
或者我们可以使用'df.select_dtypes(exclude = ['object'])'获取数字列:) – Wen
@Wen也是一个好主意! –