【问题标题】:Filter NaN rows for containing specific characters columns in Pandas过滤 NaN 行以包含 Pandas 中的特定字符列
【发布时间】:2020-11-16 03:37:10
【问题描述】:

给定一个小数据集如下:

   *id *building  floor_number *floor_name
0    1         A           8.0          5F
1    2         A           4.0          4F
2    3         A           NaN          3F
3    4         A           NaN         NaN
4    5         A           NaN         NaN
5    6         B          14.0         17F
6    7         B          13.0         16F
7    8         B          20.0       world
8    9         B          13.0       hello
9   10         B          13.0         16F

我想检查包含* 列(selected_col 如下)是否有NaN 值,所以我需要编写一个条件代码来过滤NaN 行为selected_col

selected_col = df.columns[df.columns.str.contains(pat = '^\*')]
...

我怎样才能过滤掉如下行?谢谢。

   *id *building  floor_number *floor_name
3    4         A           NaN         NaN
4    5         A           NaN         NaN

编辑:因为我需要为包含* 的列突出显示NaN 单元格(这意味着该列不应该有任何NaNs),所以我想使用np.where 如果可能的话。

np.where(conditions, None, 'contains NaNs for required columns')

参考相关:Highlight dataframe cells based on multiple conditions in Python

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    检查filterany

    out = df[df.filter(like='*').isna().any(1)]
    Out[39]: 
       *id *building  floor_number *floor_name
    3    4         A           NaN         NaN
    4    5         A           NaN         NaN
    

    【讨论】:

    • 谢谢我们可以使用 np.where 条件吗?
    • 能否请您检查我问题的编辑部分?我需要使用 np.where,因为如果可能的话,我想突出显示 * 列的 NaN 单元格。
    • np.where(df.filter(like='*').isna().any(1), None, '包含所需列的 NaN')@ahbon
    【解决方案2】:

    更好的方法是 BEEN_YO 的回答 另一种方法,您可以按照以下方式进行操作

    1. 使用列表压缩过滤您需要检查NaN 值的列,
    2. isna()方法检查
    cols = [col for col in df.columns if '*' in col]
    out = df[df[cols].isna().all(1)] 
    

    【讨论】:

    • 能否请您检查我问题的编辑部分?
    猜你喜欢
    • 2014-05-16
    • 2023-03-29
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    相关资源
    最近更新 更多