Pandas中合并过滤NaN与指定内容失败,求正确实现方法
问题分析与解决
首先,你单独执行的代码其实存在语法错误(大概率是提问时的笔误),这也是合并后失效的核心原因:
- 第一个过滤逻辑,正确写法应该是
df.loc[df['Entity'] != 'World'],而不是df.loc[['Entity'] != ('World')]。['Entity']是一个列表,和字符串'World'比较得到的是布尔值True,此时df.loc[True]只会返回DataFrame的第一行,根本达不到过滤World行的效果——你说单独执行成功,说明实际运行时你写的是df['Entity'] != 'World'(基于DataFrame的列而非列表)。 - 第二个过滤逻辑,正确写法是
df2.loc[df2['Code'].str.contains('', na=False)],['Code']是列表,没有str方法,能成功执行说明你实际用的是df2['Code']这个Series。
合并过滤的正确写法
合并两个条件时,需要注意两点:
- 每个条件都要基于DataFrame的列(即
df['列名']),不能用列表['列名']; - 逻辑运算符用
&(表示“且”),且每个条件必须用括号括起来,避免运算符优先级问题。
示例代码:
# 一步完成双重过滤 df2 = df.loc[(df['Entity'] != 'World') & (df['Code'].str.contains('', na=False))]
或者分步执行(和你单独执行的逻辑一致):
df2 = df.loc[df['Entity'] != 'World'] df2 = df2.loc[df2['Code'].str.contains('', na=False)]
额外优化建议
如果你的需求只是过滤掉Code列的NaN值,用df['Code'].notna()比str.contains('', na=False)更直观高效,写法如下:
df2 = df.loc[(df['Entity'] != 'World') & (df['Code'].notna())]
内容的提问来源于stack exchange,提问作者Shinsui
相关产品推荐
相关产品推荐

