Pandas - 查找并迭代多列中具有匹配值的行,并将另一列中的值相乘

2024-01-08

这个问题是我的进一步的进步前一个 https://stackoverflow.com/questions/51808294/pandas-find-rows-with-matching-values-in-two-columns-and-multiply-value-in-ano:

我编辑了表格,这样会减少混乱

首先假设我们有一个数据框如下:

data = pd.DataFrame({'id':['1','2','3','4','5','6','7','8','9','10'], 
                 'A':['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo','foo','bar'],  
                 'C':['10','10','10','50','50','50','50','8','10','20'], 
                 'D':['10','9','8','7','6','5','4','3','2','1']})

如下:

      A  C   D  id
0   foo 10  10  1
1   bar 10  9   2
2   foo 10  8   3
3   bar 50  7   4
4   foo 50  6   5
5   bar 50  5   6
6   foo 50  4   7
7   foo 8   3   8
8   foo 10  2   9
9   bar 20  1   10

我想做的是找到匹配行,然后进行一些计算。

for any two ids(idx, idy) in data.iterrows():
       if idx.A == idy.A and idx.C = idy.C:
       result = idx.D * idy.D

然后生成一个包含三列的新数据框['id'], ['A'] and ['result'].

@Jon Clements♦ 用以下非常简洁的代码回答了我之前的问题:

   df.merge(
        df.groupby(['A', 'C']).D.agg(['prod', 'count'])
        [lambda r: r['count'] > 1],
        left_on=['A', 'C'],
        right_index=True
    )

新目标:

现在我想知道是否有一种方法可以在与 row_b 匹配后不再迭代 row_a 。换句话说,我将这两个匹配行视为一对。一旦 row_a 和 row_b 成为一对,进一步的循环将忽略 row_a(不会忽略 row_b,直到 row_b 与另一行匹配)。

Take groupby().agg('prod', 'count')以函数为例,我希望'count'生成的所有结果中有 2 个(不仅仅是带有['count'] == 2)。我认为这不会使用groupby()所以我想像for循环这样的机制可以解决这个问题吗?或者有什么更好的方法吗?

所以现在的预期结果是(因为 id1 和 id3 已经成为一对,所以它不会聚合到 id9,并且对于其余迭代 id3 将不会与 id1 匹配。因此对于下表,第一行的结果是 80 但不是 160 ,第二行也不是):

     id   A   result   
0    1   foo   80   
1    3   foo   16
2    4   bar   35
3    5   foo   24

我的英语不是很好,所以我不确定我是否清楚地解释了我的问题。如果有什么不清楚的地方可以问我。

谢谢你的帮助。


这是一个有点冗长的解决方案,远不如 Jon Clements 为您解决第一个问题的原始解决方案那么优雅。但我想出了一个不需要 for 循环的解决方案。

# sort values by A,C,id
df = df.sort_values(['A','C','id'])
# find where A and C are equal when shifted down by 1
s=(df[['A','C']] == df[['A','C']].shift()).T.apply(lambda x: x.A and x.C)

# create a new series where we take the value of D of whe A and C are equal
# and multiply it with the next value - since it's sorted it should be next A,C match
new_d = (df.iloc[df[s].index].reset_index().D * df.iloc[df[s].index+1].reset_index().D)
new_d.index = df.iloc[df[s].index].index
new_d.name = 'results'

print(new_d)
Output >
0    80
3    35
4    24
2    16
Name: results, dtype: int64

根据上面的内容,我们简单地创建一个新列df并将其分配给new_d:

# create a new column in df and assign it to new_d
df['results'] = new_d

df.dropna()[['id','A','results']].sort_values('id')

Output:

    id  A   results
0   1   foo 80.0
2   3   foo 16.0
3   4   bar 35.0
4   5   foo 24.0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pandas - 查找并迭代多列中具有匹配值的行,并将另一列中的值相乘 的相关文章

随机推荐

  • 使用 array_multisort() 对多维 PHP 数组进行不区分大小写的排序

    经过大量搜索后 我无法找到有关如何使用 array multisort 按一个字段不区分大小写地对多维数组进行排序的良好解释 我发现在处理数据库查询信息时这是一个非常有用的功能 因此我想分享一下 我应该注意这仅适用于 php 5 4 Exa
  • ANDROID:不同尺寸的ImageView

    我是 android studio 的新手 因此 如果问题很琐碎 请原谅 我的问题是理解布局 我的布局和相应的值文件夹如下所示 我的问题是没有选择正确的布局 例如 对于 Nexus 4 4 7 英寸 768x1280 xhdpi 在横向模式
  • R Shiny:删除 ggplot2 背景以使其透明

    我想让 R Shiny Server 上的 ggplots 透明 我的绘图 ui R 如下 plotOutput malPie width 95 在 server R 中我的绘图函数如下 c lt ggplot dataFrame aes
  • 在pentaho中休息客户端

    我对 pentaho 数据集成工具非常陌生 我想从我的 pentaho 中使用一个安静的服务 post web 服务 为此 我发现我应该使用休息客户端 但是当我给出网址和正文 因为我想使用后期服务 时 它并没有在数据库中进行必要的更改 谁能
  • Moment.js 包含日期格式中间的文本

    我的格式为 2015 年 1 月 27 日上午 8 17 我需要使用 moment js 显示它 我正在使用格式 moment format MMM D YYYY at h mm A z 除了 at 这个词之外 一切都很好 我怎样才能让这个
  • 在oracle中创建密码字段

    安全外部密码存储 有什么用 我可以使用 安全外部密码存储 在 Oracle 表中创建密码字段吗 或者如何在不使用 安全外部密码存储 的情况下在 Oracle 表中创建密码字段 一种不使用 安全外部密码存储 无论是什么 的方法是将 RAW 1
  • 休眠级联持续

    我有一个关于 Hibernate 的一般性问题正在解决 我有 A 类和 B 类 其中 B 依赖于 A 在我的代码中 当我调用 em persist objOfTypeA 时 我希望插入并插入到表 AAA 和 BBB 中 如果我手动保留 A
  • Powershell:递归移动文件

    我正在尝试将所有构建输出文件和文件夹复制到Bin文件夹 输出目录 Bin 除了一些保留在输出目录 The Bin文件夹永远不会被删除 初始条件 Output config log4net file1 txt file2 txt file3
  • 删除 R 图形设备中的所有边距

    所以我在摆脱图形设备的整个边距时遇到了一些麻烦 我已将 mar 设置为 0 但边缘周围仍然存在一些持久空间 例如 plot new par mar c 0 0 0 0 plot window c 0 1 c 0 1 points c 1 1
  • 如何使用 foreachPartition 在 Spark 中为每个分区高效构建一个 ML 模型?

    我正在尝试为数据集的每个分区拟合一个 ML 模型 但我不知道如何在 Spark 中执行此操作 我的数据集基本上是这样的按公司划分 Company Features Target A xxx 0 9 A xxx 0 8 A xxx 1 0 B
  • C2DM实现PHP代码

    我正在创建使用 C2DM 推送通知的 Android 应用程序 但我在创建 php 代码以使用 c2dm 发送消息时遇到问题 请指导我如何使用 php 代码发送消息 实际上存在一个问题 即如何获取客户端身份验证令牌 我见过http code
  • ASP.NET MVC:如何设置 web.config 进行 LDAP 身份验证?

    我有一个正在运行的 LDAP 服务器 其参数如下 OU users OU mydomain O this domain LDAP myhost 389 I 成功地 access 使用通用 LDAP 客户端 就像 Jarek Gawor 的
  • 在 LINQ 中实现“不在”(又名“不存在”)逻辑

    Setup 我有两个List
  • Objective C 的 iPhone 开发中的“委托”是什么? [复制]

    这个问题在这里已经有答案了 Objective C 的 iPhone 开发中的 委托 是什么 委托是一个指向对象的指针 该对象具有委托持有者知道如何调用的一组方法 换句话说 就是启用特定回调的机制来自后来创建的对象 A 很好的例子是UIAl
  • 过滤二维数组并从中间返回坐标

    我有一个由零组成的二维数组 在 1 6 和 2 7 处有一些正整数 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0
  • Laravel 4 控制器测试 - 太多 $this->call() 后出现 ErrorException - 为什么?

    我非常感谢有关我遇到的 Laravel 4 问题的帮助 我正在测试控制器路由 特别是负责路由调查问卷响应的控制器 我正在测试以下场景 用户尝试跳过问题 用户请求不存在的问题 等等 到目前为止 我为所有场景编写的测试都可以使用 PHPunit
  • Skipgrams 上下文(kwic)中的关键字?

    我使用 Quanteda 对 ngram 和 token 进行上下文分析中的关键字 效果很好 我现在想对skipgrams 执行此操作 捕获 进入障碍 的上下文以及 和 进入障碍 下面的代码是一个空的 kwic 对象 但我不知道我做错了什么
  • 从 PERL LibXML 解析器获取完整的 XML 字符串

    我有以下需要处理的 XML table table
  • 仅使用 GitHub Actions 在特定分支上运行作业

    我对 GitHub Actions 比较陌生 我有 2 份工作 一份运行我的测试 另一份将我的项目部署到服务器上 显然 我希望测试在每个分支上运行 但是只有当某些内容被推送到 master 时才应该进行部署 我正在努力寻找一种在特定分支上运
  • Pandas - 查找并迭代多列中具有匹配值的行,并将另一列中的值相乘

    这个问题是我的进一步的进步前一个 https stackoverflow com questions 51808294 pandas find rows with matching values in two columns and mul