python - Pandas:如何通过多个条件选择行(如果不是 nan 并且等于特定值)
问题描述
我有一个数据框
指数 | 街道 | 房子 | 建造 |
---|---|---|---|
1 | 美国广播公司 | 20 | 一个 |
2 | 美国广播公司 | 20 | b |
3 | 美国广播公司 | 21 | 钠 |
4 | BCD | 2 | 1 |
需要从此 DataFrame 创建多项选择:
- 如果 Street == str_filter ;
- 如果房子 == house_filter ;
- If Building == build_filter AND If Building is not NULL ;
我已经试过了df[(df['Street'] == str_filter) & (df['House'] == house_filter) & ((df['Building'] == build_filter) & (pd.notnull(df['Building'])))
但不会导致我特别想看到的结果。我必须检查 Building 值是否不是 NaN,如果是真的选择具有特定 Building 编号的行。但是,如果该行具有建筑物的 NaN 值但也符合其他条件,我也想选择该行。
另一个想法是为一组过滤器值和一组满足 pd.notnull 标准的值创建列表:
filter_values = [str_filter, house_filter, build_filter]
notnull_values = [pd.notnull(entry) for entry in filter_values]
这个不符合性能标准,因为我有非常大的 DataFrame 并且创建带有额外过滤的额外列表会导致性能下降。可能的解决方案可能在于df.loc
功能,但我不知道如何实现。
总而言之,问题如下:如何在具有 NaN 值条件的 pandas 中创建多项选择?
UPD:看来我必须使用的功能是df[... & (df['Building'] == 'a' if pd.notnull(df['Building']))]
使用与 lambda 应用技巧的类比
解决方案
一个相当简单的方法是:
if df[df['Building'].isnull()].empty:
df[df['Street'] == str_filter][df['House'] == house_filter][df['Building'] == build_filter]
else:
df[df['Street'] == str_filter][df['House'] == house_filter][df['Building'].isnull()]
我不确定这是否能满足您的性能要求?
推荐阅读
- python - Django:如何获取原始 SQL“COUNT(*)”查询的结果?
- excel - 从 Excel 2016 VBA 中的单元格范围中删除底部边框 - 不起作用?
- google-cloud-sql - MySQL Workbench 无法在家中连接到 Google Cloud SQL
- swift - 使用嵌套函数
- javascript - 数组中的数组和键是数字 - 如何循环?
- python - 保存保存为 csv 的 pandas 数据帧的数据类型
- node.js - 降级后更新 npm 版本
- html - Html5 图片元素
- javascript - 单击 3 次后,编码 JavaScript 的问题不会替换元素
- clojure - 高阶函数中的 Clojure 运算符