首页 文章

Pandas - 删除包含Nan的行,然后删除任何关联的行

提问于
浏览
1

我有一个包含2列的数据框:'age'和'name' . 看起来像这样(在记事本中打开时):

,age,name
0,18,Bill
1,22,Harry
2,Nan,Bill
4,5,William

(第一列是索引)

我需要在age列中删除Nan的所有行,并删除name列中具有相同名称的所有行 . 例如,在我的数据框的片段中,我想要删除带有Bill的两行,因为其中一个年龄包含Nan

目前我有这个:

df_no_dups = dp[dp.isfinite(dp['age'])]

这是第一部分,但我坚持要删除与包含Nan的行同名的其他行

任何帮助都会很棒

3 回答

  • 3

    boolean indexing过滤,使用transform创建的布尔掩码进行测试,如果每组的all值没有缺失值:

    df1 = df[df['age'].notnull().groupby(df['name']).transform('all')]
    

    或检查缺失值,测试每组至少一个 True 和最后一个反转布尔掩码 ~

    df1 = df[~df['age'].isnull().groupby(df['name']).transform('any')]
    

    print (df1)
        age     name
    1  22.0    Harry
    3   5.0  William
    

    Detail

    print (df['age'].notnull())
    0     True
    1     True
    2    False
    3     True
    Name: age, dtype: bool
    
    print (df['age'].notnull().groupby(df['name']).transform('all'))
    0    False
    1     True
    2    False
    3     True
    Name: age, dtype: bool
    
  • 1

    试试这个,

    df=df.drop_duplicates(subset=['name'],keep=False)
    df[(df['age'].notnull()] #or df[(df['age']!='Nan')] (as your input Contains Nan as string)
    

    说明:

    首先删除重复项并传递 keep=False 以删除所有重复项 . 然后过滤NaN .

    输出:

    age     name
    1  22    Harry
    4   5  William
    
  • 1

    这对我有用:

    import pandas as pd
    
    df = pd.read_excel('test.xlsx')
    df = df.drop_duplicates(subset='name', keep=False)
    df = df.dropna(subset=['age'])
    

    编辑:这适用于空值,如果Nan是@Mohamed所指向的字符串,则使用他提供的答案 .

相关问题