Python Pandas-删除包含Nan的行,然后删除所有关联行

Python Pandas-删除包含Nan的行,然后删除所有关联行,python,pandas,Python,Pandas,我有一个数据框,有两列:“年龄”和“姓名”。如下所示(在记事本中打开时): (第一列是索引) 我需要在age列中删除任何带有Nan的行,并在name列中删除任何具有相同名称的行。例如,在我的数据框的片段中,我希望删除包含Bill的两行,因为其中一行包含Nan 目前我有: df_no_dups = dp[dp.isfinite(dp['age'])] 这是第一部分,但我一直在删除与包含Nan的行同名的其他行 如果每个组的值没有缺失值,则使用为测试创建的布尔掩码进行筛选将非常有帮助: df1 =

我有一个数据框,有两列:“年龄”和“姓名”。如下所示(在记事本中打开时):

(第一列是索引)

我需要在age列中删除任何带有Nan的行,并在name列中删除任何具有相同名称的行。例如,在我的数据框的片段中,我希望删除包含Bill的两行,因为其中一行包含Nan

目前我有:

df_no_dups = dp[dp.isfinite(dp['age'])]
这是第一部分,但我一直在删除与包含Nan的行同名的其他行

如果每个组的值没有缺失值,则使用为测试创建的布尔掩码进行筛选将非常有帮助:

df1 = df[df['age'].notnull().groupby(df['name']).transform('all')]
或检查缺失值,测试每组是否至少有一个
为True
,以及最后一次通过
~
反转布尔掩码:

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

详细信息

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
如果每个组的值没有缺失值,则使用为测试创建的布尔掩码进行筛选:

df1 = df[df['age'].notnull().groupby(df['name']).transform('all')]
或检查缺失值,测试每组是否至少有一个
为True
,以及最后一次通过
~
反转布尔掩码:

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

详细信息

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
试试这个

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
试试这个

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
这对我很有用:

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指出的字符串,则使用他提供的答案。

这适用于我:

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指出的字符串,则使用他提供的答案。

是的,这很有效,谢谢,转换('any')的目的是什么?我编辑答案,更好吗?如果有什么不清楚的地方,告诉我,我试着解释更多。谢谢。是的,这很有效,谢谢,转换('any')的目的是什么?我编辑答案,这样更好吗?如果有什么不清楚的地方,告诉我,我试着解释更多。谢谢。这和我的答案很相似