首页 > 解决方案 > Pandas:如何通过多个条件选择行(如果不是 nan 并且等于特定值)

问题描述

我有一个数据框

指数 街道 房子 建造
1 美国广播公司 20 一个
2 美国广播公司 20 b
3 美国广播公司 21
4 BCD 2 1

需要从此 DataFrame 创建多项选择:

我已经试过了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 应用技巧的类比

标签: pythonpandasselectionnan

解决方案


一个相当简单的方法是:

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()]

我不确定这是否能满足您的性能要求?


推荐阅读