繁体   English   中英

根据条件 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 秒,考虑到代码之前根本没有完成执行,这没关系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM