如何使用第一条记录的 RecID 更新重复行? (Python/Pandas)

How can I update duplicate rows with first record's RecID? (Python/Pandas)

我有相当大的记录集 (~200,000) 需要重复数据删除,但有一个问题。这些记录中的大多数都与另一种记录类型相关,这种关系需要移动到重复数据删除过程完成后留下的唯一记录。

为简单起见,我有 2 列,'RecID' 和 'Name',并将在结果中添加第三列 'ReplaceWith'。数据如下所示:

RecID Name
111111 example1
222222 example1
333333 example2
444444 example2
555555 example2

当 'Name' 列重复时,我想用第一项的 'RecID' 值填充 'ReplaceWith' 列 我希望完成的操作如下所示:

RecID Name ReplaceWith
111111 example1
222222 example1 111111
333333 example2
444444 example2 333333
555555 example2 333333

我是编程新手,所以这可能真的很简单。但我根本无法弄清楚如何以编程方式实现这一目标。在较小的数据集上,我会简单地使用 excel 手动排序、过滤和更新记录。但是这种方法不会扩展到这个级别。

如果有任何关于如何执行此操作的建议,我将不胜感激。

如果 你的 RecId 数据类型是 intfloat,你可以这样做:

import pandas as pd

t1 = [1111,2222,3333,4444,5555]
t1_name = ['example1', 'example1','example2','example2','example2']

df = pd.DataFrame({'rec_id': t1, 'name': t1_name})

df.sort_values(by=['rec_id', 'name'], inplace=True)

# Get values for `name` that occur more than once
names = df.groupby('name').count().reset_index()
names.rename(columns={'rec_id':'rec_count'}, inplace=True)
arr = names.loc[names.rec_count>1, 'name'].to_list()

for n in arr:
    min_id = df.loc[df.name==n, 'rec_id'].min()
    df.loc[(df.name==n) & (df.rec_id!=min_id), 'replace_with'] = min_id

这可能会有点慢,具体取决于您必须循环多少个名字。

您可以设计一个适用于每组名称的函数(此处使用 shift)并将其应用于 groupby:

def add_replacement(df):
df['ReplaceWith'] = df['RecID'].shift(1)
return df

df.groupby('Name').apply(add_replacement)
RecID Name ReplaceWith
111111 example1 nan
222222 example1 111111
333333 example2 nan
444444 example2 333333
555555 example2 444444