You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:28:12