python - 系列驱动的多个条件
问题描述
我有一个数据框来存储一个人的居住地,它看起来像这样:
教派 | 软垫 | 房间 | 人 |
---|---|---|---|
1 | 一个 | 101 | 人 1 |
1 | 一个 | 102 | 人2 |
1 | 乙 | 101 | 人 3 |
2 | 一个 | 103 | 人4 |
2 | C | 102 | PERSON5 |
我还有另一个数据框,它指定了使该住房单元特别的所有 SECT/PAD/ROOM 组合(注意:如果不存在 start_room 和 end_room,则意味着该 sect/pad 中的所有房间都是特殊的):
教派 | 软垫 | 房间 | START_ROOM | END_ROOM |
---|---|---|---|---|
1 | 一个 | 101 | 100 | 104 |
1 | 一个 | 102 | ||
1 | C | 101 | 105 | 500 |
有没有办法使用“特殊”数据框识别所有“特殊”住房单元,然后在第一个数据框中添加一个新列来标记它们。“特殊”数据框要大得多,如果我必须手动执行条件 .loc 语句来识别所有特殊住房单元,那将需要很长时间。我希望能够以编程方式匹配它们
解决方案
由于空行意味着所有房间都是特殊的,因此您可以用虚拟值(第一个 df 的最小值和最大值)填充它们,然后从合并的 DataFrame 中获取所需的结果。
假设您的 DataFrames 是df1
and df2
,您可以这样做:
df2["START_ROOM"] = df2["START_ROOM"].fillna(df1["ROOM"].min())
df2["END_ROOM"] = df2["START_ROOM"].fillna(df1["ROOM"].max())
merged = df1.merge(df2, on=["SECT", "PAD", "ROOM"], how="left")
result = df1[df1["PERSON"].isin(merged.dropna()["PERSON"].tolist())]
>>> result
SECT PAD ROOM PERSON
0 1 A 101 PERSON1
1 1 A 102 PERSON2
推荐阅读
- angular - 我是否总是在 Angular 组件 HTML 模板中为元素的属性值使用引号?
- javascript - 如何使用formgroups的formarray进行角度的mat-select
- python - Python 类属性和 PyCharm 调试器
- reactjs - ReactJS/Redux - 根组件页面在任何页面刷新时呈现
- c# - 迈瑞BC-5150 HL7通讯端口号和ip地址在哪里设置
- python - 如何修复错误:werkzeug.routing.BuildError:无法使用值 ['id'] 为端点“删除”构建 url。你的意思是“索引”吗?
- javascript - 如何通过纯javascript单击HTML中的单选按钮显示不同的表单
- mysql - SQL 查询以查找每个给定位置的最多供应商数量
- angular - bypassSecurityTrustHtml 在使用 [innerHtml] 显示 html 时禁用锚标记
- macos - 保护 Flask/Celery 应用程序的 localhost 端口,该应用程序在 MacOS 上的 Docker 中的 0.0.0.0 上本地运行