python - 检查熊猫数据框行的值
问题描述
我有以下具有不同异常检测分数的数据集(其中 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
我确定我错过了一些简单的东西,但我不确定最有效的方法是什么?
解决方案
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)
推荐阅读
- java - 有没有办法使用正则表达式将字符串中的每个数字相乘?
- azure - Azure SQL 数据库的只读用户
- python - 在 shell 脚本中插入包含双引号的字符串
- java - 在一段时间后调用 API 时第一次获取连接重置异常
- vba - 避免出现错误的“打开并修复”消息
- c++ - 将 QWidget 链接到另一个新创建的 QWidget
- php - Java - Android Studio - HttpURLConnection 发布到 PC PHP 文件
- android - 没有组件的android App有什么用?
- python - pymysql IO 期间 CPU 过高
- sql - Hive 查询以获取另一个日期一个月范围内的日期