首页 > 解决方案 > 检查熊猫数据框行的值

问题描述

我有以下具有不同异常检测分数的数据集(其中 1 是异常值,0 是内部值):

   a  b  c  d  e
0  0  0  0  0  1
1  0  1  0  0  0
2  1  0  0  0  1
3  0  0  0  0  0
4  0  0  0  0  1

我想要做的是添加另一列,它基本上检查该行是否包含 1 个值,如果是,它也有 1 个值:

   a  b  c  d  e  result
0  0  0  0  0  1   1
1  0  1  0  0  0   1
2  1  0  0  0  1   1
3  0  0  0  0  0   0
4  0  0  0  0  1   1

我确定我错过了一些简单的东西,但我不确定最有效的方法是什么?

标签: pythonpandasloops

解决方案


使用DataFrame.any

df['result'] = df.eq(1).any(axis=1).astype(int)
print (df)
   a  b  c  d  e  result
0  0  0  0  0  1       1
1  0  1  0  0  0       1
2  1  0  0  0  1       1
3  0  0  0  0  0       0
4  0  0  0  0  1       1


#50k rows for test
df = pd.concat([df] * 10000, ignore_index=True)
    
In [109]: %timeit df.any(axis=1).astype(int)
2.48 ms ± 240 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [110]: %timeit df.eq(1).any(axis=1).astype(int)
1.46 ms ± 39.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [111]: %timeit np.any(df.eq(1), axis=1).astype(int)
1.47 ms ± 28.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [112]: %timeit np.where(np.any(df.eq(1), axis=1), 1, 0)
1.5 ms ± 102 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

不知道为什么,但我得到了max

In [115]: %timeit df.max(axis=1)
2.08 ms ± 66.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [116]: %timeit np.max(df, axis=1)
2.17 ms ± 93.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

推荐阅读