1. 程式人生 > >pandas.DataFrame.merge

pandas.DataFrame.merge

pandas.DataFrame.merge

DataFrame.merge(right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)[source]

Merge DataFrame objects by performing a database-style join operation by columns or indexes.

If joining columns on columns, the DataFrame indexes will be ignored. Otherwise if joining indexes on indexes or indexes on a column or columns, the index will be passed on.

Parameters:

right : DataFrame

how : {‘left’, ‘right’, ‘outer’, ‘inner’}, default ‘inner’

  • left: use only keys from left frame, similar to a SQL left outer join; preserve key order
  • right: use only keys from right frame, similar to a SQL right outer join; preserve key order
  • outer: use union of keys from both frames, similar to a SQL full outer join; sort keys lexicographically
  • inner: use intersection of keys from both frames, similar to a SQL inner join; preserve the order of the left keys

on : label or list

Column or index level names to join on. These must be found in both DataFrames. If on is None and not merging on indexes then this defaults to the intersection of the columns in both DataFrames.

left_on : label or list, or array-like

Column or index level names to join on in the left DataFrame. Can also be an array or list of arrays of the length of the left DataFrame. These arrays are treated as if they are columns.

right_on : label or list, or array-like

Column or index level names to join on in the right DataFrame. Can also be an array or list of arrays of the length of the right DataFrame. These arrays are treated as if they are columns.

left_index : boolean, default False

Use the index from the left DataFrame as the join key(s). If it is a MultiIndex, the number of keys in the other DataFrame (either the index or a number of columns) must match the number of levels

right_index : boolean, default False

Use the index from the right DataFrame as the join key. Same caveats as left_index

sort : boolean, default False

Sort the join keys lexicographically in the result DataFrame. If False, the order of the join keys depends on the join type (how keyword)

suffixes : 2-length sequence (tuple, list, …)

Suffix to apply to overlapping column names in the left and right side, respectively

copy : boolean, default True

If False, do not copy data unnecessarily

indicator : boolean or string, default False

If True, adds a column to output DataFrame called “_merge” with information on the source of each row. If string, column with information on source of each row will be added to output DataFrame, and column will be named value of string. Information column is Categorical-type and takes on a value of “left_only” for observations whose merge key only appears in ‘left’ DataFrame, “right_only” for observations whose merge key only appears in ‘right’ DataFrame, and “both” if the observation’s merge key is found in both.

validate : string, default None

If specified, checks if merge is of specified type.

  • “one_to_one” or “1:1”: check if merge keys are unique in both left and right datasets.
  • “one_to_many” or “1:m”: check if merge keys are unique in left dataset.
  • “many_to_one” or “m:1”: check if merge keys are unique in right dataset.
  • “many_to_many” or “m:m”: allowed, but does not result in checks.

New in version 0.21.0.

Returns:

merged : DataFrame

The output type will the be same as ‘left’, if it is a subclass of DataFrame.

See also

merge_ordered, merge_asof, DataFrame.join

Notes

Support for specifying index levels as the on, left_on, and right_on parameters was added in version 0.23.0

Examples

>>> A              >>> B
    lkey value         rkey value
0   foo  1         0   foo  5
1   bar  2         1   bar  6
2   baz  3         2   qux  7
3   foo  4         3   bar  8
>>> A.merge(B, left_on='lkey', right_on='rkey', how='outer')
   lkey  value_x  rkey  value_y
0  foo   1        foo   5
1  foo   4        foo   5
2  bar   2        bar   6
3  bar   2        bar   8
4  baz   3        NaN   NaN
5  NaN   NaN      qux   7

https://www.cnblogs.com/stream886/p/6022049.html

使用Pandas進行資料匹配

本文轉載自:藍鯨的網站分析筆記

原文連結:使用Pandas進行資料匹配

 

目錄

 


Pandas中的merge函式類似於Excel中的Vlookup,可以實現對兩個資料表進行匹配和拼接的功能。與Excel不同之處在於merge函式有4種匹配拼接模式,分別為inner,left,right和outer模式。 其中inner為預設的匹配模式。本篇文章我們將介紹merge函式的使用方法和4種拼接模式的區別。

managed-services-mergers

下面是我們準備進行拼接的兩個資料表,左邊是貸款狀態表loan_stats,右邊為使用者等級表member_grade。我們將分別用merge函式的4種匹配模式對這兩個表進行拼接。

row_data

準備工作

開始使用merge函式進行資料拼接之前先匯入所需的功能庫,然後將分別讀取兩個資料表,並命名為loanstats表和member_grade表。

1

2

3

4

import numpy as np

import pandas as pd

loanstats=pd.DataFrame(pd.read_excel('loanStats.xlsx'))

member_grade=pd.DataFrame(pd.read_excel('member_grade.xlsx'))

函式功能介紹

merge函式的使用方法很簡單,以下是官方的函式功能介紹和使用說明。merge函式中第一個出現的資料表是拼接後的left部分,第二個出現的資料表是拼接後的right部分。第三個是資料匹配模 式,預設是inner模式。第四個引數on表示資料匹配所依據的欄位名稱,如果這個欄位名稱同時出現在兩個資料表中,那麼可以省略on引數的設定,merge預設會按照兩個資料表中共有的欄位名稱進行匹配和拼接。如果兩個資料表中的匹配欄位名稱不一致,則需要分別在left_on和right_on引數中指明兩個表匹配欄位的名稱。如果兩個資料表中沒有匹配欄位,需要使用索引列進行匹配和拼接,可以對left_index和right_index引數設定為True。merge還有一些排序和其他的引數,可在需要使用時進行設定。

merge

Inner模式匹配

inner模式是merge的預設匹配模式,我們通過下面的文氏圖來說明inner的匹配方法。Inner模式提供在loanstats和member_grade表中共有欄位的匹配結果。也就是對兩個的表交集部分進行匹配和拼接。單獨只出現在一個表中的欄位值不會參與匹配和拼接。

inner_img

以下是使用merge函式進行拼接的程式碼,因為inner是預設的拼接模式,因此也可以省略how=’inner’部分。其中第一個出現的loanstats出現在拼接後的左側,member_grade出現在拼接後的右側。拼接後的資料表中只包含兩個表的交集,因此不存在未匹配到的NaN情況。

1

loan_inner=pd.merge(loanstats,member_grade,how='inner')

inner
left模式匹配

left模式是左匹配,以左邊的資料表loanstats為基礎匹配右邊的資料表member_grade中的內容。匹配不到的內容以NaN值顯示。在Excel中就好像將Vlookup公式寫在了左邊的表中。下面的文氏圖說明了left模式的匹配方法。Left模式匹配的結果顯示了所有左邊資料表的內容,以及和右邊資料表共有的內容。

left_img

以下為使用left模式匹配並拼接後的結果,loanstats在merge函式中第一個出現,因此為左表,member_grade第二個出現,為右表。匹配模式為left模式。從結果中可以看出left匹配模式保留了一張完整的loanstats表,以此為基礎對member_grade表中的內容進行匹配。loanstats表中有兩個member_id值在member_grade中無法找到,因此grades欄位顯示為NaN值。

1

loan_left=pd.merge(loanstats,member_grade,how='left')

left
right模式匹配

第三種模式是right匹配,right與left模式正好相反,right模式是右匹配,以右邊的資料表member_grade為基礎匹配左邊的資料表loanstats。匹配不到的內容以NaN值顯示。下面通過文氏圖說明right模式的匹配方法。Right模式匹配的結果顯示了所有右邊資料表的內容,以及和左邊資料表共有的內容。

right_img

以下為使用right模式匹配拼接的結果,從結果表中可以看出right匹配模式保留了完整的member_grade表,以此為基礎對loanstats表進行匹配,在member_grade資料表中有兩個條目在loanstats資料表中無法找到,因此顯示為了NaN值。

1

loan_right=pd.merge(loanstats,member_grade,how='right')

right

outer模式匹配

最後一種模式是outer匹配,outer模式是兩個表的彙總,將loanstats和member_grade兩個要匹配的兩個表彙總在一起,生成一張彙總的唯一值資料表以及匹配結果。

outer_img
下面是使用outer模式匹配拼接的結果,其中member_id列包含了loanstats和member_grade中的唯一值,grade列顯示了對member_grade表匹配的結果,其他列則顯示了對loanstats表匹配的結果 ,無法匹配的內容以NaN值顯示。

1

loan_outer=pd.merge(loanstats,member_grade,how='outer')

outer
NaN值匹配問題

在進行資料匹配和拼接的過程中經常會遇到NaN值。這種情況下merge函式會如何處理呢?merge會將兩個資料表中的NaN值進行交叉匹配拼接,換句話說就是將loanstats表member_id列中的NaN值
分別與member_grade表中member_id列中的每一個NaN值進行匹配,然後再拼接在一張表中。下面是包含NaN值的兩張資料表進行拼接的結果,當我們使用left模式進行匹配時,loanstats作為基礎
表,其中member_id列的NaN值分別與member_grade表中member_id列的每一個NaN值進行匹配。並將匹配結果顯示在了結果表中。

1

loan_left=pd.merge(loanstats,member_grade,how='left')

NaN值匹配

 

df3['objectid'].isnull()產生的是一列布爾陣列

用它 可以過濾非空行:

df表的行列的選取方法:

.loc is primarily label based根據行標和列標選取,但是有個特例:

當行標是數字時,ddf.loc[1:2,['eci']]中的1:2好像是通過行號選擇行,實際是通過行標選擇行。

 將行標改為3,4 則 .loc[1:2,]就查不到了。

 

.iloc is primarily integer position based 根據行號和列號選取。

Object Type Indexers
Series s.loc[indexer]
DataFrame df.loc[row_indexer,column_indexer] 先行後列
Panel p.loc[item_indexer,major_indexer,minor_indexer]