簡體   English   中英

基於列之間的部分字符串匹配連接數據幀

[英]Join dataframes based on partial string-match between columns

我有一個 dataframe 我想比較它們是否存在於另一個 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 

我想要這樣的東西作為我的最終 output:

    FILM              votes
0  Max Steel           560

有兩種方式:

  1. 獲取部分匹配的行索引: FILM.startswith(title)FILM.contains(title) 兩者之一:

    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
  1. 或者,如果將復合字符串列 df2['FILM'] 轉換為其兩個組件列movie_title (year) ,則可以使用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

(感謝@user3483203 在這里和 Python 聊天室的幫助)

重新創建數據幀的代碼:

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')

給定輸入數據幀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

smci的選項 1 幾乎就在那里,以下對我有用

df1['Votes'] = ''
df1['Votes']=df1['movie'].apply(lambda title: df2[df2['FILM'].str.startswith(title)]['Votes'].any(0))

解釋:

在 df1 中創建一個 Votes 列

將 lambda 應用於 df1 中的每個電影字符串

lambda 查找 df2,選擇 df2 中 Film 以電影標題開頭的所有行

選擇 df2 結果子集的 Votes 列

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM