基于Pandas中的公共列值合并两个数据帧

Har*_*_pb 26 dataframe pandas

如何从具有公共列值的两个数据帧获得合并的数据帧,使得仅那些行使合并的数据帧在特定列中具有共同的值.

我有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
Run Code Online (Sandbox Code Playgroud)

和万行df2as

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
Run Code Online (Sandbox Code Playgroud)

公共列'movie_title'具有共同的值,并且基于它们,我想获得'movie_title'相同的所有行.要删除的其他行.

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

注意:我已经尝试过了

pd.merge(dfinal, df1, on='movie_title')
Run Code Online (Sandbox Code Playgroud)

输出就像一排

director_name   actor_1_name    actor_2_name    actor_3_name    movie_title movieId title   genres
Run Code Online (Sandbox Code Playgroud)

并且在如何="外部"/"左","右",我尝试了所有并且在放弃NaN之后没有获得任何行,尽管存在许多共同的coloumn.

pan*_*sen 32

你可以使用pd.merge:

import pandas as pd
pd.merge(df1, df2, on="movie_title")
Run Code Online (Sandbox Code Playgroud)

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

  • @Harry_pb,这意味着你只有一个匹配的`movie_title`.仅当字符串__exactly__相同时,合并才能正常工作. (2认同)
  • @Harry_pb,你最后是怎么解决这个问题的?我遇到了同样的问题:左 df 和右 df 显然具有相同的公共列,但合并后的 df 始终为空! (2认同)
  • 我在上一条评论之后才发现了这一点...我的2个DF中的common列看起来一样,只是数字,但是实际上,一个DF将数字存储在int64中,而另一个将其存储在对象中!完全让我发疯了! (2认同)

Har*_*_pb 23

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

import pandas
dfinal = df1.merge(df2, on="movie_title", how = 'inner')
Run Code Online (Sandbox Code Playgroud)

对于基于不同数据帧的列的合并,您可以指定左右公共列名称,特别是在同一列的两个不同名称含糊不清的情况下,可以说 - 'movie_title'as 'movie_name'.

dfinal = df1.merge(df2, how='inner', left_on='movie_title', right_on='movie_name')
Run Code Online (Sandbox Code Playgroud)

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


小智 8

如果您想合并两个 DataFrame 并且您想要一个合并的 DataFrame,其中只有来自两个数据帧的公共值才会出现,然后进行内部合并。

import pandas as pd

merged_Frame = pd.merge(df1, df2, on = id, how='inner')
Run Code Online (Sandbox Code Playgroud)