簡體   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