如何在python中检测异常值并创建新变量

时间:2017-10-25 02:42:38

标签: python pandas

这是我的名为bp的数据:

    a   b  c    d   e   ....
    1   2  5    3   999 ....
    2   4  2    4   2   ....
    999 2  8    7   999 .... 

在这个数据中,我想检测包含'999'的列。有一次,我们发现它有'999',那么我们需要创建一个名为'变量名'+'_check'的新变量,例如,'a'列包含'999',那么我们需要创建一个新列名为'a_check'。然后,在'a_check'中,如果原始变量是极端的,我希望值为1。所以我希望有这个:

        a   b  c    d   e   a_check e_check
        1   2  5    3   999 0       1
        2   4  2    4   2   0       0
        999 2  8    7   999 1       1

我有很多这样的变量,所以我在考虑如何在python中自动化这个过程。

到目前为止,这是我的工作:

for columns in bp:
   if any(bp.columns == -999.000):
      bp['columns' + '_check'] = int((bp.columns == -999.000))

我的代码不会出错,但不起作用。

3 个答案:

答案 0 :(得分:1)

这是你想要的吗?

pd.concat([df,(df==999).loc[:,(df==999).any()].astype(int).add_suffix('_check')],axis=1)
Out[624]: 
     a  b  c  d    e  a_check  e_check
0    1  2  5  3  999        0        1
1    2  4  2  4    2        0        0
2  999  2  8  7  999        1        1

答案 1 :(得分:1)

首先创建一个条件为真的检查列,

df['check'] = df[df == 999].idxmax(1)

你得到了

    a   b   c   d   e   check
0   1   2   5   3   999 e
1   2   4   2   4   2   NaN
2   999 2   8   7   999 a

现在在check

中创建与非空值对应的列
for col in df.check[df.check.notnull()].values.tolist():
    df[col+'_check'] = (df[col] == 999).astype(int)

你得到了

    a   b   c   d   e   check   e_check a_check
0   1   2   5   3   999     e   1       0
1   2   4   2   4   2       NaN 0       0
2   999 2   8   7   999     a   1       1

答案 2 :(得分:-1)

在python3中试试这个:

for columns in bp:
  if 999 in bp[columns].values:
    bp[columns + '_check'] = list(map(lambda x: int(x == 999), bp[columns]))