python - 具有多列的 Pandas isin
问题描述
我想选择数据框中包含列表中定义的值的所有行。我有两种方法都不能按预期/想要的方式工作。
我的数据框看起来像这样:
Timestamp DEVICE READING VALUE
1 | DEV1 | READ1 | randomvalue
2 | DEV1 | READ2 | randomvalue
3 | DEV2 | READ1 | randomvalue
4 | DEV2 | READ2 | randomvalue
5 | DEV3 | READ1 | randomvalue
我有如下列表(ls):
[[DEV1, READ1], [DEV1, READ2], [DEV2,READ1]]
在这种情况下,我想删除行4
和5
:
我的第一种方法是:
df = df[(df['DEVICE']. isin([ls[i][0] for i in range(len(ls))])) &
(df['READING'].isin([ls[k][1] for k in range(len(ls))]))]
这个问题很明显,它没有删除第 4 行,因为 DEV2 有 READING READ2,但它应该删除它。
我的第二种方法是:
df = df[(df[['DEVICE','READING']].isin({'DEVICE': [ls[i][0] for i in range(len(ls))],
'READING': [ls[i][1] for i in range(len(ls))] }))]
这一个选择正确的行,但它不会删除其他行。相反,它将所有其他单元格设置为 NaN,包括我想要保留的 VALUE ROW。而且它不会同时累积,所以第 4 行看起来像4 |DEV2|NaN|NaN
解决这个问题的最简单或最好的方法是什么?你能帮助我吗?
~法比安
解决方案
您可以将列表转换为元组列表。将数据框中所需的列转换为元组并使用 isin
l = [['DEV1', 'READ1'], ['DEV1', 'READ2'], ['DEV2','READ1']]
l = [tuple(i) for i in l]
df[df[['DEVICE', 'READING']].apply(tuple, axis = 1).isin(l)]
你得到
Timestamp DEVICE READING VALUE
0 1 DEV1 READ1 randomvalue
1 2 DEV1 READ2 randomvalue
2 3 DEV2 READ1 randomvalue
推荐阅读
- visual-studio - 通过 Connected Services 创建 openapi 客户端后生成错误
- python - 如何使用任务流 api 为 on_failure 指定函数
- nginx - Flask为所有路由添加多个前缀
- hadoop - 如何使用 Sqoop 将 Parquet 数据从 S3 导入 HDFS?
- python - 运行一个函数,直到另一个函数完成
- amazon-web-services - AWS EventBridge 过滤器中的事件模式使用字段而不是内容
- angular - 使用 Angular Reactive Forms 获取下拉值
- node.js - 尝试为 Ubuntu VPS 构建 tensorflow
- css - 带有父容器的粘性左列
- webpack - Webpack 代码拆分:如何使用不同的 tree-shaking 复制模块