根据条件 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 循环,但我找不到更好的解决方案,如果你能帮助我改进我的代码,我将不胜感激。
groupby
在 SessionId
和 pagePath
上计算每对出现的累计次数;然后使用 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 秒,考虑到代码之前根本没有完成执行,这没关系。
我正在尝试根据以下条件删除数据框中的重复行: 如果 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 循环,但我找不到更好的解决方案,如果你能帮助我改进我的代码,我将不胜感激。
groupby
在 SessionId
和 pagePath
上计算每对出现的累计次数;然后使用 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 秒,考虑到代码之前根本没有完成执行,这没关系。