如何识别和标记列/数组中每n个元素的序列中的异常,或每5个元素组成的组中的“奇数”异常

2024-06-01 13:06:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两列groupref。在ref列中,我感兴趣的是根据数据集中每五个元素的precedingfollowing元素来识别anomaliesodd_one_out元素,例如[Y,Y,N,Y,Y]{}是异常,或者[N,N,N,Y,N]在这种情况下,异常是Yref有助于比较和匹配pred。 对于每一组五个值,都有一个odd_one_outanomaly元素

注意:dataframe有340000行-但是,我对每五个元素(340000/5)都感兴趣,因此group 1-5

df

group, ref 
1,  Y
2,  Y
3,  Y
4,  N
5,  Y
1,  Y
2,  Y
3,  N
4,  Y
5,  N

以下是我期望的结果: 我想在anomaly列中将异常标记为'x'

Final_df 

group, ref, anomaly

1, Y, NaN 
2, Y, NaN
3, Y, NaN
4, N, 'x'
5, Y, NaN
1, Y, NaN
2, Y, NaN
3, N, 'x'
4, Y, NaN
5, N, NaN

NaN表示anomaly列中缺少的值,否则留空

这是我的密码


def list_slice(S, step):
    return [S[i::step] for i in range(step)]
print(list_slice(pred,5))

df['anomaly']= anomaly


Tags: 数据ref元素dfstepgroupslicenan
2条回答

一行完成

在编辑之后。这应该有效

df['anomaly']=df.ref.replace(['Y','N'], ['NaN','x'])

如果您将原始问题保留在哪里

print(df)

   group ref, pred
0    1,   Y,    Y
1    2,   Y,    Y
2    3,   Y,    Y
3    4,   Y,    N
4    5,   Y,    Y
5    1,   Y,    Y
6    2,   Y,    Y
7    3,   Y,    N
8    4,   Y,    Y
9    5,   N,    N

解决方案

df['anomaly']=pd.Series(np.where(df.iloc[:,-2:].replace(['Y,','Y','N,','N'],[True, True, False, False]).nunique(1).eq(2),'x',np.nan))

    group ref, pred anomaly
0    1,   Y,    Y     nan
1    2,   Y,    Y     nan
2    3,   Y,    Y     nan
3    4,   Y,    N       x
4    5,   Y,    Y     nan
5    1,   Y,    Y     nan
6    2,   Y,    Y     nan
7    3,   Y,    N       x
8    4,   Y,    Y     nan
9    5,   N,    N     nan

它是如何工作的

#df.replace(-the datset is dirty. I get rid of  the commas indf.ref as I simultaneously convert Y into True and N into false

g=df.iloc[:,-2:].replace(['Y,','Y','N,','N'],[True, True, False, False])

#g.nunique(1) ccounts the unique values in rowwise

g.nunique(1)

#np.where(condition, answer if condition is true, answer if condition is false) helps me populate x and NaN

aaray=np.where(g.nunique(1).eq(2),'x',np.nan)

#pd.Series(array) converts array into df column

只需比较refpred列即可得到所需的结果

a = pd.DataFrame([[1,'Y','Y'],[2,'Y','Y'],[3,'Y','Y'],[4,'Y','N'],[5,'Y','Y'],
             [1,'Y','Y'],[2,'Y','Y'],[3,'Y','N'], [4,'Y','Y'], [5,'N','N']],
            columns = ['group', 'ref', 'pred'])

a['anomaly'] = a['ref'] == a['pred']






    group   ref     pred    anomaly
0   1   Y   Y   True
1   2   Y   Y   True
2   3   Y   Y   True
3   4   Y   N   False
4   5   Y   Y   True
5   1   Y   Y   True
6   2   Y   Y   True
7   3   Y   N   False
8   4   Y   Y   True
9   5   N   N   True

相关问题 更多 >