如何使用第一条记录的 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
数据类型是 int
或 float
,你可以这样做:
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
我有相当大的记录集 (~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
数据类型是 int
或 float
,你可以这样做:
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 |