【问题标题】:Selecting Pandas rows where more than 1 column is not NaN [duplicate]选择超过 1 列不是 NaN 的 Pandas 行 [重复]
【发布时间】:2019-05-31 03:37:24
【问题描述】:

我有一个按以下方式设置的数据框:

header_1 | header_2 | header_3 | header_4

a            b         NaN        NaN
b            c          9          10
x            y         NaN         8

如何使用列索引(列名更改)选择 header_3 和 header_4 都不是 NaN 的行? header_3 和 header_4 是整数

谢谢

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如果可能,列表中定义的多个列使用DataFrame.all 检查不缺少过滤列的值,以检查每行的所有Trues:

    cols = ['header_3','header_4']
    
    df = df[df[cols].notnull().all(axis=1)]
    print (df)
      header_1 header_2  header_3  header_4
    1        b        c       9.0      10.0
    # df[df[['header_3', 'header_4']].notnull().all(axis=1)]  # Just to avoid creating a list of cols and calling that.
    

    对于按最后 2 列选择,请使用 iloc 按位置选择:

    df = df[df.iloc[:, -2:].notnull().all(axis=1)]
    

    也可以通过索引器指定列:

    #python count from 0
    df = df[df.iloc[:, [2,3]].notnull().all(axis=1)]
    # df[df.loc[:, ['header_3', 'header_4']].notnull().all(axis=1)]  # or can use loc with direct columns name
    

    或者,如果只有 2 列链条件与 & 按位 AND

    df = df[df['header_3'].notnull() & df['header_4'].notnull()]
    

    【讨论】:

    • 您好,感谢您的回答!有没有办法使用列索引?问题中的两列始终是数据框中的最后一列,但它们的名称可能会改变
    • @Macterror - 当然,检查编辑的答案。
    • 做到了!我会在 6 分钟内接受你的回答。非常感谢
    • @jezrael,我们也可以添加df[df.loc[:, ['header_3', 'header_4']].notnull().all(axis=1)],只是为了演示提及列名。
    • @pygo - 是的,所以想df = df[df[['header_3', 'header_4']].notnull().all(axis=1)]
    【解决方案2】:

    还有.dropna

    subset = ['header_3', 'header_4']
    df.dropna(subset=subset, thresh=len(subset))
    
    #  header_1 header_2  header_3  header_4
    #1        b        c       9.0      10.0
    

    【讨论】:

      猜你喜欢
      • 2017-03-07
      • 2013-10-22
      • 2021-10-10
      • 2015-08-15
      • 2020-10-06
      • 2018-09-16
      • 2017-01-22
      • 2022-12-01
      • 2021-01-25
      相关资源
      最近更新 更多