如果一个列值与第二个 df 列值匹配,我有两个数据框过滤 onmatch 列行

Posted

技术标签:

【中文标题】如果一个列值与第二个 df 列值匹配,我有两个数据框过滤 onmatch 列行【英文标题】:I have two data frames if one column value matches second df column values filter the onmatch column rows 【发布时间】:2018-02-08 12:47:40 【问题描述】:

我这里有两个数据框:df1 在这里

id name
11 abc
12 cdf
13 mmm
14 hhh

df2 在这里:

id status
11 1
12 1
13 0

我需要的是 df1 id 匹配 df2 id 然后状态 0 我已经从 df1 过滤了完整的行,如下所示

id name
11 abc
12 cdf

【问题讨论】:

您遇到问题的代码是什么?你的代码有什么问题?您收到错误消息吗?错误信息是什么?你得到的结果不是你期望的结果吗?你期望什么结果,为什么,你得到的结果是什么,两者有什么不同?您正在观察的行为不是期望的行为吗?期望的行为是什么,为什么,观察到的行为是什么,它们有何不同?请提供minimal reproducible example。 您能否提供一个精确说明您希望发生的事情,包括任何和所有规则、这些规则的例外情况、极端情况、特殊情况、边界情况和边缘情况?您能否提供示例输入和输出来展示您期望发生的情况,无论是在正常情况下,还是在所有异常情况、极端情况、特殊情况、边界情况和边缘情况下?请同时确保提供minimal reproducible example。 “我需要的是 […]”——你可以通过编写一个程序来做到这一点。如果您的程序有问题,请仔细阅读您正在使用的所有方法、类、模块和库的文档,为您的程序编写测试,用笔和纸跟踪执行,在调试器中单步执行,然后睡在上面,从头开始,再睡,然后然后只有这样将你的问题缩小到简洁、集中、简单、简短、可重复的minimal reproducible example 并问一个具体的问题,在Stack Overflow 上集中、狭窄的问题。 【参考方案1】:

您可以通过 id 加入它们,然后按状态值过滤并删除最后一列

     val joined = df1.join(df2, "id")
                     .filter($"status" !== 0)
                     .drop("status")

一行一行:

join => 通过id 加入两个数据帧,结果将同时具有status 和名称columns(显然除了id column) filter => 只保留与谓词匹配的行。在这种情况下,status 不是 0 drop => 删除 status 列,因为最终输出中不需要它

输出是:

+---+----+
| id|name|
+---+----+
| 12| cdf|
| 11| abc|
+---+----+

【讨论】:

感谢您的回复..它的工作,但问题是来自 df2 的实时问题,我们可能没有更多的列,我必须一次性删除所有这些列,请您帮帮我。 【参考方案2】:

我建议您在df2select 中将status 列中的0 值与0 列的 结合起来 df1这比加入后进行过滤在性能方面更好。

val tempDF2 = df2.filter($"status" =!= "0").select("id")

df1.join(tempDF2, Seq("id")).show(false)

你的输出应该是

+---+----+
|id |name|
+---+----+
|11 |abc |
|12 |cdf |
+---+----+

【讨论】:

以上是关于如果一个列值与第二个 df 列值匹配,我有两个数据框过滤 onmatch 列行的主要内容,如果未能解决你的问题,请参考以下文章

将 DataFrame 列值与另一个 DataFrame 列匹配并计算命中数

如何为第一个数据帧中匹配的特定列值的所有值获取第二个数据帧的数据?

将列值与第一行进行比较并保留 R 中的原始值

R - 如果列值与字符向量中的任何值匹配,则返回它旁边的列 [重复]

如何检查来自不同数据框的列值?

当行悬停并且列值与另一行匹配时显示工具提示