根据条件 pandas 删除 DataFrame 中的重复行

Delete repeating rows in a DataFrame based on a condition pandas

我正在尝试根据以下条件删除数据框中的重复行: 如果 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 循环,但我找不到更好的解决方案,如果你能帮助我改进我的代码,我将不胜感激。

groupbySessionIdpagePath 上计算每对出现的累计次数;然后使用 np.ediff1d 找到连续元素的差异并将其分配给 df['cumcount'],并且由于我们要过滤掉连续的重复项,我们过滤掉 df['cumcount']!=1:

cols = df.columns
df['cumcount'] = np.concatenate(([0], np.ediff1d(df.groupby(['SessionId','pagePath']).cumcount())))
out = df.loc[df['cumcount']!=1, cols]

无论如何,按照惯例必须自己解决这个问题,没有@np8 的评论是不可能的。对于任何可能感兴趣的人:

locations = []
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:
            if data.SessionId[i] == data.SessionId[i - 1] and data.pagePath[i] == data.pagePath[i - 1]:
                locations.append(i)
        except KeyError as e:
            print(e)
            continue

data_cleaned = data.drop(index=locations)

对于 6,5 Mio 行的 DataFrame,这花费了 470 秒,考虑到代码之前根本没有完成执行,这没关系。