代码之家  ›  专栏  ›  技术社区  ›  Kim Stacks

如何根据数据帧的条件选择列中缺少值的行?

  •  0
  • Kim Stacks  · 技术社区  · 7 年前

    我有一个从excel表中提取的数据框。

    我在找不合法的排。

    1. 正好填写了1列,但其他列为空或空
    2. 只填写了2列,但其他列为空或空
    3. 8列都填好了

    因此,非法定行与上述行相反,例如:

    1. 8列中有7列已填写,但有一列为空

    我感兴趣的8列是:A、B、D、E、F、G、i、L列。

    我只想退回那些不合法的行。

        empty_A = sheet[sheet[sheet.columns[0]].isnull()]
        empty_B = sheet[sheet[sheet.columns[1]].isnull()]
        empty_D = sheet[sheet[sheet.columns[3]].isnull()]
        empty_E = sheet[sheet[sheet.columns[4]].isnull()]
        empty_F = sheet[sheet[sheet.columns[5]].isnull()]
        empty_G = sheet[sheet[sheet.columns[6]].isnull()]
        empty_I = sheet[sheet[sheet.columns[8]].isnull()]
        empty_L = sheet[sheet[sheet.columns[11]].isnull()]
        print(empty_G)
    

    更新:

    list comprehension

    1 回复  |  直到 7 年前
        1
  •  0
  •   Dev Khadka    7 年前

    如果您已经填充了数据帧,那么您可以这样做

    import numpy as np
    import pandas as pd
    
    ## Generate Random Data
    raw_data=np.random.choice([None,1], (50,8))
    raw_data= np.r_[raw_data, np.random.choice([None, 1,2,3], (50,8))]
    
    ## Create dataframe from random data
    df = pd.DataFrame(raw_data, columns="A, B, D, E, F, G, I, L".split(","))
    notnull_counts = (~df.isnull()).sum(axis=1)
    
    ## filter rows with your condition
    legit_rows = df[((notnull_counts==1) | (notnull_counts==2) | (notnull_counts==8))]
    non_legit_rows = df[~((notnull_counts==1) | (notnull_counts==2) | (notnull_counts==8))]
    
    display(legit_rows)
    
    
        2
  •  0
  •   PaSTE Zac Gochenour    7 年前

    sum() 到 perform the sum for each row by using axis="columns" ,就像这样:

    # This is a series indexed like df.
    # It counts the number of null values in the given columns.
    n_null = df[["A", "B", "D", "E", "F", "G", "I", "L"]].isnull().sum(axis="columns")
    
    # This selects the rows where n_null has certain values.
    df_notlegit = df.loc[n_null.isin([8, 5, 4, 3, 2])]
    
    # This is another way to do it.
    df_nonlegit = df.loc[(n_null > 1) & (n_null < 9)]
    
        3
  •  0
  •   moys    7 年前
    df.loc[(df.isna().sum(axis=1)==0) | (df.isna().sum(axis=1)==7) | (df.isna().sum(axis=1)==6)]