Pandas中如何删除包含[removed]、[deleted]字符串的数据行?
解决Pandas移除包含[deleted]/[removed]行的问题
你遇到的问题很典型——你执行了筛选操作,但没有把筛选后的结果重新赋值回你的DataFrame,所以原始的df根本没有被修改,保存后自然还是能看到那些目标行。
让我一步步帮你修正:
为什么你的代码没生效?
你现在的代码是这样的:
df[df["Comments"].str.contains("deleted")==False] df[df["Comments"].str.contains("removed")==False]
这两行代码只是生成了筛选后的临时DataFrame,但你没有把它们赋值给df(或者其他变量),所以原始的df完全没变化。而且就算你分开赋值,第二次筛选会覆盖第一次的结果,导致只移除了包含removed的行,漏掉deleted的。
正确的解法
我们可以把两个条件合并,一次性筛选掉包含任意一个关键词的行,并且把结果赋值回df:
方法1:合并条件,用|表示“或”
# 筛选出既不包含"deleted"也不包含"removed"的行 df = df[~(df["Comments"].str.contains("deleted") | df["Comments"].str.contains("removed"))]
这里的~是Pandas里的取反操作,相当于==False,写法更简洁。
方法2:用单个str.contains匹配多个关键词
更高效的方式是用正则表达式,在str.contains里一次性匹配两个关键词:
# 用正则|匹配任意一个关键词,同时处理可能的空值(na=False) df = df[~df["Comments"].str.contains(r'\[deleted\]|\[removed\]', na=False)]
这里加r'\[deleted\]'是因为方括号在正则里是特殊字符,需要转义;na=False是用来处理Comments列可能存在的空值(NaN),避免筛选时出现报错或者漏行。
方法3:分步处理(如果需要保留中间步骤)
如果你想分步处理,记得每一步都要赋值:
# 先移除包含deleted的行 df = df[df["Comments"].str.contains("deleted") == False] # 再移除包含removed的行 df = df[df["Comments"].str.contains("removed") == False]
不过这种方式效率不如一次性合并条件高,尤其是数据量大的时候。
完整修正后的代码
把你的完整代码修改后应该是这样:
import pandas as pd sol2020 = pd.read_csv("Solana_2020_Comments_Time_Adjusted.csv") sol2021 = pd.read_csv("Solana_2021_Comments_Time_Adjusted.csv") df = pd.concat([sol2021, sol2020], ignore_index=True, sort=False) # 关键修正:移除包含[deleted]或[removed]的行,并重新赋值给df df = df[~df["Comments"].str.contains(r'\[deleted\]|\[removed\]', na=False)] # 之后再保存你的df # df.to_csv("your_output_file.csv", index=False)
额外提醒
如果你的Comments列存在空值(NaN),一定要加上na=False参数,否则str.contains遇到NaN会返回NaN,这些行在筛选时会被自动排除(因为NaN在布尔判断里被视为False),可能会导致你意外丢失一些数据。
内容的提问来源于stack exchange,提问作者coder888




