根据 Pandas 中的公共列值合并两个数据框

Posted

技术标签:

【中文标题】根据 Pandas 中的公共列值合并两个数据框【英文标题】:Merge two data frames based on common column values in Pandas 【发布时间】:2017-09-03 23:41:52 【问题描述】:

如何从具有共同列值的两个数据框中获取合并的数据框,以便只有这些行使合并的数据框在特定列中具有共同值。

我有 5000 行 df1 格式:-

    director_name   actor_1_name    actor_2_name    actor_3_name    movie_title
0   James Cameron   CCH Pounder Joel David Moore    Wes Studi     Avatar
1   Gore Verbinski  Johnny Depp Orlando Bloom   Jack Davenport   Pirates 
    of the Caribbean: At World's End
2   Sam Mendes   Christoph Waltz    Rory Kinnear    Stephanie Sigman Spectre

10000 行 df2

movieId                   genres                        movie_title
    1       Adventure|Animation|Children|Comedy|Fantasy   Toy Story
    2       Adventure|Children|Fantasy                    Jumanji
    3       Comedy|Romance                             Grumpier Old Men
    4       Comedy|Drama|Romance                      Waiting to Exhale

一个共同的列“movie_title”有共同的值,并基于它们,我想得到“movie_title”相同的所有行。其他要删除的行。

任何帮助/建议将不胜感激。

注意:我已经试过了

pd.merge(dfinal, df1, on='movie_title')

输出就像一行

director_name   actor_1_name    actor_2_name    actor_3_name    movie_title movieId title   genres

关于 ="outer"/"left", "right" 的方式,我尝试了所有方法,但在删除 NaN 后没有得到任何行,尽管确实存在许多常见的列。

【问题讨论】:

【参考方案1】:

你可以使用pd.merge:

import pandas as pd
pd.merge(df1, df2, on="movie_title")

仅保留在两个数据帧中都找到公共键的行。如果您想保留左侧数据框中的所有行并且只添加来自df2 的值,其中匹配键可用,您可以使用how="left"

【讨论】:

这行不通,好像只有一行director_name actor_1_name actor_2_name actor_3_name movie_title movieId 标题流派 @Harry_pb,这意味着您只有一个匹配的movie_title。只有当字符串完全相同相同时,合并才能正常工作。 @Harry_pb,你最后是怎么解决这个问题的?我遇到了同样的问题:left df 和 right df 显然有相同的公共列,但是合并的 df 总是空的! 我在上一条评论之后才发现...我的 2 个 DF 中的 common 列看起来一样,只是数字,但实际上,一个 DF 将数字存储在 int64 中,而另一个存储他们在对象!完全把我逼疯了!!【参考方案2】:

我们可以通过多种方式合并两个数据框。 python 中最常见的方法是在 Pandas 中使用合并操作。

import pandas
dfinal = df1.merge(df2, on="movie_title", how = 'inner')

对于基于不同数据框的列进行合并,您可以指定左右公共列名,特别是在同一列的两个不同名称有歧义的情况下,假设 - 'movie_title''movie_name'

dfinal = df1.merge(df2, how='inner', left_on='movie_title', right_on='movie_name')

如果你想更具体,你可以阅读 pandas merge 操作的文档。

【讨论】:

【参考方案3】:

如果你想合并两个 DataFrame,并且你想要一个合并的 DataFrame,其中只有两个数据帧的共同值会出现,那么请进行内部合并。

import pandas as pd

merged_Frame = pd.merge(df1, df2, on = id, how='inner')

【讨论】:

以上是关于根据 Pandas 中的公共列值合并两个数据框的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pandas:如何根据一个公共键将多行数据组合成一行?

当不存在公共记录时,Pandas 合并删除添加的列

pandas根据两个条件设置列值[重复]

根据列值删除Python Pandas中的DataFrame行[重复]

根据列值加入熊猫数据框

根据其他列值/ Pandas -Python 在数据框中创建 ID 列