使用Python Pandas识别同金额交易并生成唯一标识列
解决Pandas交易识别与编号分配需求
先确认下我们的初始数据和生成的DataFrame:
import pandas as pd import numpy as np d = {'emp': ['a', 'a', 'a', 'b', 'b', 'b'], 'vendor': ['x', 'x', 'y', 'z', 'z', 'z'], 'date': [1,1,2,3,3,3], 'amount': [4.9, 4.8, 1, 6, 5.6, 5.4]} df = pd.DataFrame(data=d) df["rounds"]=np.ceil(df['amount'])
生成的结果如下:
amount date emp vendor rounds 0 4.9 1 a x 5.0 1 4.8 1 a x 5.0 2 1.0 2 a y 1.0 3 6.0 3 b z 6.0 4 5.6 3 b z 6.0 5 5.4 3 b z 6.0
一、识别所有金额相同的交易
要标记出所有存在重复金额的交易,我们可以新增一个布尔列来标识。用duplicated方法并设置keep=False,这样所有重复出现的金额对应的行都会被标记为True:
# 新增标记列,标记该金额是否存在重复交易 df['has_duplicate_amount'] = df.duplicated('amount', keep=False)
执行后,DataFrame会变成这样(你的示例数据里没有重复金额,所以全是False;如果有重复金额,对应的行会显示True):
amount date emp vendor rounds has_duplicate_amount 0 4.9 1 a x 5.0 False 1 4.8 1 a x 5.0 False 2 1.0 2 a y 1.0 False 3 6.0 3 b z 6.0 False 4 5.6 3 b z 6.0 False 5 5.4 3 b z 6.0 False
如果要筛选出这些重复交易,直接用df[df['has_duplicate_amount']]就能得到结果。
二、创建example列:同一emp下金额相同的交易分配唯一编号
这里分两种常用场景,你可以根据需求选择:
场景1:每个员工内部的编号独立递增
比如员工a的编号从1开始,员工b的编号也从1开始,同一员工下相同金额的交易共用同一个编号:
df['example'] = df.groupby('emp')['amount'].transform(lambda x: pd.factorize(x)[0] + 1)
执行后的结果:
amount date emp vendor rounds example 0 4.9 1 a x 5.0 1 1 4.8 1 a x 5.0 2 2 1.0 2 a y 1.0 3 3 6.0 3 b z 6.0 1 4 5.6 3 b z 6.0 2 5 5.4 3 b z 6.0 3
如果员工a有两行金额为4.9的记录,那它们的example都会是1,完美实现同一emp下相同金额共享编号的需求。
场景2:全局唯一编号(跨员工)
如果希望编号是全局唯一的,不同员工的相同金额也会分配不同编号:
df['example'] = df.groupby(['emp', 'amount']).ngroup() + 1
这种情况下,员工a的第一个金额编号是1,员工b的第一个金额编号是4,以此类推。
补充:更精细的重复识别(按需选择)
如果你的“金额相同的交易”是指同一emp、vendor、日期下的重复金额,可以调整分组键:
# 标记这类场景下的重复交易 df['is_duplicate'] = df.duplicated(['emp', 'vendor', 'date', 'amount'], keep=False) # 分配对应的唯一编号 df['example'] = df.groupby(['emp', 'vendor', 'date', 'amount']).ngroup() + 1
内容的提问来源于stack exchange,提问作者Ni_Tempe
相关产品推荐
相关产品推荐

