Pandas. 选择具有多列缺失值的行

6
假设我们有一个包含列“Race”、“Age”和“Name”的数据框。我想创建两个数据框:
1)没有“Race”和“Age”列中的缺失值
2)仅包含“Race”和“Age”列中缺失值的数据
我编写了以下代码。
first_df = df[df[columns].notnull()]
second_df= df[df[columns].isnull()]

然而,这段代码无法正常工作。我使用以下代码解决了这个问题。

first_df= df[df['Race'].isnull() & df['Age'].isnull()]
second_df = df[df['Race'].isnull() & df['Age'].isnull()]

但如果有10列呢?有没有一种方法可以不使用逻辑运算符,只使用columns列表来编写此代码?

2个回答

5
如果选择多个列得到一个布尔值的数据框,那么有必要通过DataFrame.all来测试所有列是否为True,或者通过DataFrame.any来测试每行至少有一个元素为True。
first_df = df[df[columns].notnull().all(axis=1)]
second_df= df[df[columns].isnull().all(axis=1)]

您还可以使用~来表示反向掩码:
mask = df[columns].notnull().all(axis=1)
first_df = df[mask]
second_df= df[~mask]

.all()和.any()有什么区别?顺便说一下,非常感谢。你的解决方案有效! - Rustem Sadykov
@RustemSadykov - 对于AND操作,所有的ID都需要用 & 连接,而对于OR操作,则需要用 | 进行连接。 - jezrael

1

步骤1:创建一个新的数据框,删除缺失数据(NaN、pd.NaT、None),您可以过滤掉不完整的行。DataFrame.dropna删除包含至少一个缺失数据字段的所有行。

假设新的数据框为DF_updated,早期的为DF_Original。

步骤2:现在我们的解决方案数据框将是两个数据框之间的差异。它可以通过pd.concat([DF_Original,DF_updated]).drop_duplicates(keep=False)找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接