【问题标题】:compare the multiple columns from two different dataframes and map the values using pandas比较来自两个不同数据帧的多列并使用 pandas 映射值
【发布时间】: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


【解决方案1】:

你可以试试这样的:

df1 = pd.merge(df1, df2,  how='outer', left_on=["col_a"], right_on = ['col_2'])
df1 = df1.drop(columns=["col_1","col_2","col_3","e_values_x"])
df1 = df1.rename(columns={'e_values_y':'e_values'})
  • 使用外连接根据col_acol_1 列合并数据框。
  • 删除不需要的列
  • 重命名列 e_values,因为它在合并期间自动添加到数据框后缀中。

【讨论】:

  • 不,这不适合我的问题,请用表格格式的数据查看我编辑的问题,并帮助我解决问题
  • 我认为方法是一样的,您只需要更改要比较的列的名称即可。
  • 不,它不起作用。例如,对于预期输出中的第一行,正确的输出如上图所示 ['sales', 'dog', 'cat'] 因为两列 'dog' 都匹配,但它给出了一些其他的随机值列表。
  • 我已经更新了答案你现在可以查看
  • 再次无法正常工作。这里应该有值的比较,这就是我不知道的地方,如何比较和映射相应的值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多