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

时间:2017-04-08 16:32:35

标签: pandas dataframe

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

我有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

以及如何=“外”/“左”,“右”,我尝试了所有并且在放弃NaN之后没有获得任何行,尽管存在许多常见的coloumn。

3 个答案:

答案 0 :(得分:23)

您可以使用pd.merge

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

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

答案 1 :(得分:15)

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

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

对于基于不同数据框的列的合并,您可以指定左右公共列名称,特别是在同一列的两个不同名称含糊不清的情况下,我们可以说 - 'movie_title''movie_name'。< / p>

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

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

答案 2 :(得分:3)

如果要合并两个数据框,并且要合并的数据框仅出现两个数据框中的公共值,则进行内部合并。

<div class="row">
     @(Html.Kendo().Grid<Entity.MasterEntity.StateMaster>()
      .Name("StateGrid")
      .Columns(columns =>
      {
       columns.Bound(p => p.StateName).Filterable(ftb => ftb.Cell(cell => cell.ShowOperators(true).Operator("contains"))).Width(120);
       columns.Bound(p => p.Abbr).Filterable(ftb => ftb.Cell(cell => cell.ShowOperators(true).Operator("contains"))).Width(120).MinScreenWidth(800);
       columns.Command(command => { command.Edit(); command.Destroy(); }).Width(70);
      })
      .ToolBar(toolbar =>
      {
       toolbar.ClientTemplateId("toolbarStatus");
      })
      .NoRecords(e => e.Template("<div class='alert alert-warning' style='padding:3px'><h6 class='bold'><i>No data found!</i></h6></div>"))
      .Pageable(p => { p.Refresh(true); p.PageSizes(true); }).Navigatable()
      .Sortable(s => s.SortMode(GridSortMode.MultipleColumn)).Scrollable(s => s.Enabled(true))

      .HtmlAttributes(new { style = "height:100%;" })
      .DataSource(dataSource => dataSource
       .Ajax()
       .PageSize(10)
       .ServerOperation(true)
       .Model(m =>
       {
        m.Id(s => s.StateId);
        m.Field(f => f.StateName);
        m.Field(f => f.Abbr);
        m.Field(f => f.RecordStatus);
       })

       .Read(read => read.Action("GetStateList", "Masters"))

      )
      .Resizable(resize => resize.Columns(false))
     )
</div>