根据列之间的部分字符串匹配来联接数据框

时间:2018-09-10 21:00:11

标签: python pandas join string-matching partial

我有一个数据框,如果它们存在于另一个df中,我想对其进行比较。

after_h.sample(10, random_state=1)

             movie           year   ratings
108 Mechanic: Resurrection   2016     4.0
206 Warcraft                 2016     4.0
106 Max Steel                2016     3.5
107 Me Before You            2016     4.5

我想比较上面的电影是否存在于另一个df中。

              FILM                   Votes
0   Avengers: Age of Ultron (2015)   4170
1   Cinderella (2015)                 950
2   Ant-Man (2015)                   3000 
3   Do You Believe? (2015)            350
4   Max Steel (2016)                  560 

我想要这样的东西作为最终输出:

    FILM              votes
0  Max Steel           560

3 个答案:

答案 0 :(得分:2)

有两种方法:

  1. 获取部分匹配(FILM .startswith()标题)或FILM .contains()标题的行索引。

    df1[ df1.movie.apply( lambda title: df2.FILM.str.startswith(title) ).any(1) ]

    df1[ df1['movie'].apply(lambda title: df2['FILM'].str.contains(title)).any(1) ]

         movie  year  ratings
    

    106 Max Steel 2016 3.5

  2. 或者,如果将复合字符串列df2 ['FILM']转换为其两个组成列merge() ,则可以使用movie_title (year)

# see code at bottom to recreate your dataframes
df2[['movie','year']] = df2.FILM.str.extract('([^\(]*) \(([0-9]*)\)')
# reorder columns and drop 'FILM' now we have its subfields 'movie','year'
df2 = df2[['movie','year','Votes']]
df2['year'] = df2['year'].astype(int)

df2.merge(df1)
       movie  year  Votes  ratings
0  Max Steel  2016    560      3.5

(在此以及在Python聊天室中从@ user3483203那里获得了很多帮助)

重新创建数据框的代码:

import pandas as pd
from pandas.compat import StringIO

dat1 = """movie           year   ratings
108  Mechanic: Resurrection   2016     4.0
206  Warcraft                 2016     4.0
106  Max Steel                2016     3.5
107  Me Before You            2016     4.5"""

dat2 = """FILM                   Votes
0   Avengers: Age of Ultron (2015)   4170
1   Cinderella (2015)                 950
2   Ant-Man (2015)                   3000
3   Do You Believe? (2015)            350
4   Max Steel (2016)                  560"""

df1 = pd.read_csv(StringIO(dat1), sep='\s{2,}', engine='python', index_col=0)
df2 = pd.read_csv(StringIO(dat2), sep='\s{2,}', engine='python')

答案 1 :(得分:1)

给定输入数据帧df1df2,您可以通过pd.Series.isin使用布尔索引。要对齐电影字符串的格式,您需要先将电影和年份从df1连接起来:

s = df1['movie'] + ' (' + df1['year'].astype(str) + ')'

res = df2[df2['FILM'].isin(s)]

print(res)

               FILM  VOTES
4  Max Steel (2016)    560

答案 2 :(得分:0)

smci的选项1即将出现,以下对我有用:

<android.support.design.widget.NavigationView
    ...
    app:itemIconTint="@android:color/black" 
    ... />

说明:

在df1中创建一个投票栏

将lambda应用于df1中的每个电影字符串

lambda查找df2,选择df2中电影以电影标题开头的所有行

选择生成的df2子集的“投票”列

使用any(0)取得此列中的第一个值