【发布时间】:2022-01-14 03:41:54
【问题描述】:
我正在尝试根据以下条件删除数据框中的重复行: 如果 pagePath 列的值与上一行相同且 SessionId 相同,我需要删除该行。如果 SessionId 不同,则不应删除重复的 pagePath。这是我尝试过的:
data = data.sort_values(['SessionId', 'Datum'], ascending=True, ignore_index=True)
i = 0
for i, _ in data.iterrows(): # i = index, _ = row
if i != 0:
try:
while data.SessionId[i] == data.SessionId[i - 1] and data.pagePath[i] == data.pagePath[i - 1]:
data = data.drop(i - 1)
data = data.reset_index(drop=True)
except KeyError:
continue
如您所见,我得到了 KeyError 异常,但我认为这并不坏,因为代码对具有 1000 行的数据框执行了应有的操作。唯一的问题是它不适用于具有 6,5 Mio 行的更大数据集。它要么永远不会完成,要么我得到 SIGKILL。我很清楚我不应该对数据集使用 for 循环,但我找不到更好的解决方案,如果您能帮助我改进我的代码,我将不胜感激。
【问题讨论】:
-
对我来说,您似乎在迭代
df时对其进行了修改。我对么?这可能会导致一些意外行为。通常更好的是在 for 循环期间收集要删除的行的位置,然后一次性删除所有选定的行。 -
你考虑过
drop_duplicates的使用吗? -
@saiden 是的,但我也不确定如何告诉 python 也考虑 SessionId?仅删除一个 SessionId 内的 pagePath 列中的重复值
-
类似
data.drop_duplicates(subset=['SessionId', 'pagePath'], keep='first')?只要它是你想要的。 -
@saiden 不是,在第一个答案下面回答了为什么
标签: python pandas for-loop rows data-cleaning