【发布时间】:2021-11-14 09:39:33
【问题描述】:
我有两个数据框,其中两个数据框中都有共同的列,在比较列值时,如果两个数据框中的值匹配,则应在其中一个数据框中添加新列,如下所示。
df1:
|other_col | col_a | col_b | col_c | e_values |
|:----------:|:--------:|:-------:|:-----:|:--------:|
|a | dog | egg | hi | |
|a | s | f | good | |
|b | t | u | bad | |
|c | u | r | data1 | |
|d | v | l | data2 | |
|b | w | h | data3 | |
df2:
|col_1 | col_2 | col_3 | e_values |
|:-----:|:------:|:------:|:---------------------:|
|sales | dog | egg | ['sales','dog','egg'] |
|call | s | f | ['call','s','f'] |
|hello | v | l | ['hello','v','l'] |
我已经使用了逻辑
df1 = pd.merge(df1, df2, how='outer', left_on=["col_a","col_b"], right_on = ['col_1','col_2'])
我得到的输出:
|other_col | col_a | col_b | col_c | col_1 |e_values |
|:----------:|:--------:|:-------:|:-----:|:-----:|:---------------------:|
|a | dog | egg | hi | | |
|a | s | f | good | | |
|b | t | u | bad | | |
|c | u | r | data1 | | |
|d | v | l | data2 | | |
|b | w | h | data3 | | |
| | dog | egg | | sales | ['sales','dog','egg'] |
| | s | f | | call | ['call','s','f'] |
| | v | l | | hello | ['hello','v','l'] |
在此,如果 df2[['col_2','col_3']] 中的值与 df1[['col_a','col_b']] 匹配,然后应将名为 e_values 的新列添加到 in **df1 中,其中的值列表完全来自 df2
预期输出:
|other_col | col_a | col_b | col_c |e_values |
|:----------:|:--------:|:-------:|:-----:|:-------------------------------:|
|a | dog | egg | hi | ['sales','dog','egg'] |
|a | s | f | good | ['call','s','f'] |
|b | t | u | bad | no match, random list of values |
|c | u | r | data1 | random values |
|d | v | l | data2 | ['hello','v','l'] |
|b | w | h | data3 | random values |
【问题讨论】:
-
我明白这些不是你的真实数据。但是,如果您不提供可复制和粘贴的mre,就会使人们更难帮助您。 (这些不是我的说明,顺便说一句,这是官方的 SO 材料。)
-
请在代码问题中给出minimal reproducible example--剪切&粘贴&运行代码;具有期望和实际输出的示例输入(包括逐字错误消息);标签和版本;明确的规范和解释。对于包含最少代码的错误,您可以给出的代码是您显示的代码可以通过您显示的代码扩展为不正常。 (调试基础。)对于 SQL 包括 DDL 和表格初始化代码。当你得到一个你不期望的结果时,暂停你的总体目标,切到第一个具有意外结果的子表达式并说出你的期望和原因,并通过文档证明是合理的。 How to AskHelp center
-
这个例子不能是“剪切&粘贴&运行”。您谈论“我使用的逻辑”,但您没有证明您的“应该”是合理的,因此“为什么,由文档证明是合理的”。 (似乎您可能认为“逻辑”意味着“代码”,但事实并非如此。) PS 我的评论提到了错误消息,因为它是样板文件。 PS 请在发布之前查看您帖子的格式化版本。请参阅编辑帮助重新阻止和内联格式以获取代码和引号。通过编辑而不是 cmets 进行澄清。 PS Minimal 包括输入。
-
LEFT/RIGHT JOIN 返回 INNER JOIN 行以及由 NaN 扩展的不匹配的左/右(各自)表行。 FULL JOIN (
how='outer') 给出了 INNER JOIN 行以及由 NaN 扩展的不匹配的左右表行。始终知道 INNER JOIN 是左/右/完整 JOIN 的一部分。 PS 通常“外连接”用于统称左、右和全连接。使用how='outer'进行完全连接是一个非常糟糕的语言/库选择。 -
PS 你没有给出预期的输出,你给出了预期输出的混乱和不清楚的 cmets。 PS 请参阅编辑帮助重新表格式。 (它不属于代码块格式。)(但你不应该使用它,你应该在代码块中提供“表格初始化代码”(列格式的代码)作为minimal reproducible example的一部分。)跨度>
标签: python pandas dataframe join merge