DataFrame数据清理:保留Destination与Origin均为World的行,删除其余同值行
解决贸易流DataFrame的筛选问题
嘿,这个问题我熟!首先得说,你用iterrows()处理200万行绝对是踩坑了——这方法不仅慢得离谱,还很容易因为索引变化或者变量名写错出问题(比如你代码里遍历的是dfn,但删行用的是df,这大概率是你之前失败的原因之一)。
咱们直接用pandas的向量化操作来解决,既高效又靠谱。你的需求是:删除所有原产国和目的国相同但不是"World"的行,保留原产国和目的国都是"World"的记录,同时保留所有原产国≠目的国的行。
方法一:直接构造符合要求的条件
我们可以把筛选条件拆成两种符合要求的情况,用逻辑或(|)连接:
- 情况1:目的国≠原产国(这是你原来的筛选逻辑)
- 情况2:目的国=原产国,且这个值是"World"
代码实现如下:
# 构建筛选条件 keep_condition = (dfn["Destination"] != dfn["Origin"]) | \ ((dfn["Destination"] == dfn["Origin"]) & (dfn["Destination"] == "World")) # 应用筛选,得到新的DataFrame dfn = dfn[keep_condition]
方法二:反向排除不符合要求的行
另一种思路是直接排除掉**原产国=目的国且不是"World"**的行,剩下的就是我们要保留的:
# 定义需要排除的条件 exclude_condition = (dfn["Destination"] == dfn["Origin"]) & (dfn["Destination"] != "World") # 取反后筛选,保留符合要求的行 dfn = dfn[~exclude_condition]
为什么这两种方法更好?
- 速度快:pandas的向量化操作是基于底层C实现的,处理200万行基本秒级完成,比
iterrows()快几十甚至上百倍。 - 避免索引问题:遍历删行时,
inplace=True会实时修改DataFrame的索引,导致后续遍历的行索引错位,而向量化操作是一次性完成筛选,完全不会有这个问题。
内容的提问来源于stack exchange,提问作者Georges
相关产品推荐
相关产品推荐

