将重复行的其他列替换为第一个唯一值并创建查找

2024-03-27

这是数据——

Account_Number  Dummy_Account
1050080713252   ACC0000000000001
1050223213427   ACC0000000000002
1050080713252   ACC0000000169532
1105113502309   ACC0000000123005
1100043521537   ACC0000000000004
1100045301840   ACC0000000000005
1105113502309   ACC0000000000040

Rows 1,3中有重复值Account_Number。行也是如此4,7。 我需要替换中的重复值Account_Number具有相同的值Dummy_Account。因此对于1050080713252,两行1,3应该有相同的虚拟值ACC0000000000001。但我不想直接替换,而是想保留原始映射。

我的预期输出是 -

Account_Number_Map      Dummy_Account_Original
ACC0000000000001    ACC0000000000001
ACC0000000000002    ACC0000000000002
ACC0000000000001    ACC0000000169532
ACC0000000123005    ACC0000000123005
ACC0000000000004    ACC0000000000004
ACC0000000000005    ACC0000000000005
ACC0000000123005    ACC0000000000040

Since ACC0000000169532是重复的Dummy_Account w.r.t Account_Number,我想创建一个查找,将其替换为ACC0000000000001

我尝试过的

我开始创建一个dict像这样 -

maps = dict(zip(df.Dummy_Account, df.Account_Number))

我想创建一个dict将会有原来的Dummy_Account值作为key和新的Dummy_Account值作为value但我有点失落。我的数据集很大,所以我也在寻找优化的解决方案。


Option 1
我会用groupby and transform with first.
transform将在所有实例中广播第一个遇到的值 团体的。

df.assign(
    Account_Number=
    df.groupby('Account_Number')
      .Dummy_Account
      .transform('first')
)

     Account_Number     Dummy_Account
0  ACC0000000000001  ACC0000000000001
1  ACC0000000000002  ACC0000000000002
2  ACC0000000000001  ACC0000000169532
3  ACC0000000123005  ACC0000000123005
4  ACC0000000000004  ACC0000000000004
5  ACC0000000000005  ACC0000000000005
6  ACC0000000123005  ACC0000000000040

Option 2
使用 Numpy 的np.unique获得第一个值和逆值的索引。
指数(idx) 标识第一个唯一位置'Account_Number'发生了。我用这个来切片'Dummy_Account'。然后我使用逆数组(inv)旨在将唯一值放回原位,但我将其用于重合数组中位于相同位置的事物上。

u, idx, inv = np.unique(
    df.Account_Number.values,
    return_index=True,
    return_inverse=True
)

df.assign(
    Account_Number=
    df.Dummy_Account.values[idx][inv]
)

     Account_Number     Dummy_Account
0  ACC0000000000001  ACC0000000000001
1  ACC0000000000002  ACC0000000000002
2  ACC0000000000001  ACC0000000169532
3  ACC0000000123005  ACC0000000123005
4  ACC0000000000004  ACC0000000000004
5  ACC0000000000005  ACC0000000000005
6  ACC0000000123005  ACC0000000000040

Option 3
或者使用pd.factorize and pd.Series.duplicated.
与选项 2 类似,但是我让duplicated起到识别第一个值在哪里的作用。然后,我用生成的布尔数组对重合值进行切片,然后用以下结果将其反转pd.factorize. f扮演着同样的角色inv来自选项 2。

d = ~df.Account_Number.duplicated().values
f, u = pd.factorize(df.Account_Number.values)

df.assign(
    Account_Number=
    df.Dummy_Account.values[d][f]
)

     Account_Number     Dummy_Account
0  ACC0000000000001  ACC0000000000001
1  ACC0000000000002  ACC0000000000002
2  ACC0000000000001  ACC0000000169532
3  ACC0000000123005  ACC0000000123005
4  ACC0000000000004  ACC0000000000004
5  ACC0000000000005  ACC0000000000005
6  ACC0000000123005  ACC0000000000040

时间测试

Results

res.plot(loglog=True)
res.div(res.min(1), 0)

              jez      cold      pir1      pir2      pir3
10       4.524811  3.819322  2.870916  1.000000  1.238144
30       4.833144  4.093932  3.310285  1.000000  1.382189
100      4.863337  4.048008  3.146154  1.000000  1.320060
300      5.144460  3.894850  3.157636  1.000000  1.357779
1000     4.870499  3.742524  2.348021  1.000000  1.069559
3000     5.375105  3.432398  1.852771  1.126024  1.000000
10000    7.100372  4.335100  1.890134  1.551161  1.000000
30000    7.227139  3.993985  1.530002  1.594531  1.000000
100000   8.052324  3.811728  1.380440  1.708170  1.000000
300000   8.690613  4.204664  1.539624  1.942090  1.000000
1000000  7.787494  3.668117  1.498758  2.129085  1.000000

Setup

def jez(d):
    v = d.sort_values('Account_Number')
    v['Account_Number'] = v['Dummy_Account'].mask(v.duplicated('Account_Number')).ffill()
    return v.sort_index()

def cold(d):
    m = d.drop_duplicates('Account_Number', keep='first')\
         .set_index('Account_Number')\
         .Dummy_Account

    return d.assign(Account_Number=d.Account_Number.map(m))

def pir1(d):
    return d.assign(
        Account_Number=
        d.groupby('Account_Number')
         .Dummy_Account
         .transform('first')
    )

def pir2(d):
    u, idx, inv = np.unique(
        d.Account_Number.values,
        return_index=True,
        return_inverse=True
    )

    return d.assign(
        Account_Number=
        d.Dummy_Account.values[idx][inv]
    )

def pir3(d):
    p = ~d.Account_Number.duplicated().values
    f, u = pd.factorize(d.Account_Number.values)

    return d.assign(
        Account_Number=
        d.Dummy_Account.values[p][f]
    )


res = pd.DataFrame(
    index=[10, 30, 100, 300, 1000, 3000, 10000,
           30000, 100000, 300000, 1000000],
    columns='jez cold pir1 pir2 pir3'.split(),
    dtype=float
)

np.random.seed([3, 1415])
for i in res.index:
    d = pd.DataFrame(dict(
        Account_Number=np.random.randint(i // 2, size=i),
        Dummy_Account=range(i)
    ))
    d = pd.concat([df] * i, ignore_index=True)
    for j in res.columns:
        stmt = f'{j}(d)'
        setp = f'from __main__ import {j}, d'
        res.at[i, j] = timeit(stmt, setp, number=100)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将重复行的其他列替换为第一个唯一值并创建查找 的相关文章

随机推荐

  • MVVM:如何将参数传递给 ViewModel 的构造函数

    我正在使用 L Bugnion 的 MVVM Light 框架 将参数 例如 Customers IS 传递给 ViewModel 构造函数的推荐方法有哪些 编辑 每个 ViewModel 所需的参数不是跨模型共享的参数 它对于每个视图模型
  • 如何在 MVC 6 beta7 中插入自定义视图引擎?

    在 beta6 中 我们能够像这样插入自定义视图引擎 services AddMvc AddViewOptions options gt options ViewEngines Clear options ViewEngines Add t
  • 如何查看交易是通过模拟账户购买还是通过真实账户购买?

    我正在使用测试帐户进行应用内购买测试 但谷歌的响应与从真实帐户进行的购买相同 如何根据谷歌的响应检查购买是否是测试 是的 您可以从Google的Purchases subscriptions API响应的purchaseType字段中检查这
  • 列表操作复杂度

    我一直认为List
  • 在 PHP 中重新格式化日期

    我有一个像这样的日期 时间字符串 180510 112440 格式为 ddmmyy hhmmss 我需要一个片段来格式化字符串 2010 05 18 11 24 40 感谢帮助 另一个可能的答案是常见的用法strptime http php
  • 构造函数中参数较少的构造函数

    我有构造函数树 int a int b int c 和第二个构造函数树 int a int b int c String s 如何从第一个构造函数加载第二个构造函数以节省编写所有逻辑 我想过这样的事情 但它给了我 空 对象 public T
  • Python Tkinter 刷新画布

    你好 我在 python 中有一个元组 其颜色与通过以下字典在画布中绘制的正方形相关 colour mapping 0 red 1 green 2 blue 3 purple 更具体地说 例如元组中的节点是 2 3 3 3 这意味着 4 个
  • 扩展方法在 C# 中有任何限制

    我想问一下 向数据类型添加扩展方法是否与微软的方法一样 或者有什么限制吗 这与经验丰富的程序员有关 他们在使用它们时发现了一些限制 您正在考虑什么样的限制 我不是特别喜欢它们被发现的方式 特别是 如果扩展类型稍后获得具有相同签名的方法 则将
  • 使用 UIWebView 上传照片

    假设我在远程服务器上有一个网页 例如 filebrowse html 有一个浏览文件按钮 我想通过UIWebView并从我的画廊上传照片 画廊位于 iPhone 上 这可能吗 在 iOS 上 无法 浏览文件系统 因此您无法使用 UIWebV
  • 将 UIButton 字体大小调整为宽度

    我有以下代码 UIButton button UIButton buttonWithType UIButtonTypeCustom button frame CGRectMake 0 0 0 0 25 25 button layer set
  • 有没有办法阻止 Prettier 接触 HTML 文件中的
     块?                
                

    Prettier 通常在 HTML 上做得非常好 但缩进了 pre gt 代码块 我总是希望 pre gt 代码块不缩进 似乎我应该能够在 prettierignore 中配置它 但找不到有效的方法 块如 pre class line nu
  • Telerik().ScriptRegistrar() 如何防止加载 jquery 库?

    即使在之后 脚本注册器也会加载 jquery validation min js Html Telerik ScriptRegistrar jQuery false 有什么办法告诉它不要这样做吗 即使当我尝试加载我需要的内容时 也会这样做
  • 无法删除 docker 镜像,守护进程的错误响应

    我对 ubuntu 还很陌生 所以可能缺少一些简单的东西 我正在尝试删除我的 docker 镜像 sudo docker rmi
  • 当我更改为 RTL 时,material-ui 图标不会翻转

    我用过瑞安 科格斯韦尔的回答 https stackoverflow com questions 62799638 material ui textfield not affected with the rtl direction让我的项目
  • 开源 FSK 解码器库? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Phabricator 第一次“弧线土地”失败

    我已经安装并配置了 Phabricator 因此它在网络上没有显示任何警告 然后我尝试创建一个存储库并进行第一次 git 提交 我已接受修订 但是当我尝试执行 arc land 时 它失败并显示以下消息 gt arc land Landin
  • 修改$PATH变量

    尝试安装node js Did brew install node 似乎已经奏效了 然而 完成后收到此消息 自制安装了 npm 我们建议将以下路径添加到您的PATH环境变量来获取 npm 安装的二进制文件 usr local share n
  • 如何将 Promise 与 Angular.js 和 $resource 与查询字符串一起使用?

    使用需要传递给它的查询字符串 参数的资源来处理 Angular js 中的承诺的最佳方法是什么 我已经看到 q 的工作在工厂 控制器和路由器中处理 但我不确定在涉及参数时如何处理它 所以如果这是工厂 angular module Anima
  • Firebase 身份验证失败并出现 FirebaseException:JsonResponse 实例化失败

    Problem 我刚刚为我的其中一个创建了更新Xamarin Forms应用程序 现在我遇到的问题是Firebase登录工作流程突然中断after上传新的 aab到 Google Play 到目前为止一直运行良好 当我尝试登录时 选择 Go
  • 将重复行的其他列替换为第一个唯一值并创建查找

    这是数据 Account Number Dummy Account 1050080713252 ACC0000000000001 1050223213427 ACC0000000000002 1050080713252 ACC0000000