關于pandas merge 合并操作的講解

pandas 中的merge是一種功能比較強大的用于兩個DataFrame或者Series進行合并的方法.

合并時會將所有的列進行合并,但是指定鍵值不存在行列會填充NaN.


直接復制官方文檔 :
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)

常用參數解釋:

  1. right : DataFrame or named Series:

    • 當使用pandas.merge()時,right處實際填入兩個待合并的結構;當使用dataframe.merge()時,right處僅填入一個待合并的結構,此處的right與dataframe分別作為右/左結構.
  2. how : {‘left’, ‘right’, ‘outer’, ‘inner’}, default ‘inner’:

    • how指定了結構的融合的類型,是一個關于key的重要參數
    • 默認inner,即采用交叉部分的key作為列的內容
    • left: 即選取左側結構的key作為列的內容
    • right: 即選取左側結構的key作為列的內容
    • outer: 選取所有的鍵作為列內容.
    • 不存在的內容用NaN填充
  3. on : label or list
    Column or index level names to join on. These must be found in both DataFrames.

    • 參數on指定了用于合并的鍵key.
    • 參數on指定的鍵必須是兩個結構中共有的.
  4. indicator : bool or str, default False
    If True, adds a column to output DataFrame called “_merge” with information on the source of each row.

    • indicator 用于指示說明該行所用的鍵來自于哪一邊結構.
  5. left_index : bool, default False
    Use the index from the left DataFrame as the join key(s).

    • left_index 設定為True, 即根據左側結構的index進行merge. 而不再是根據某一columns.
  6. right_index : bool, default False
    Use the index from the right DataFrame as the join key. Same caveats as left_index.

    • right_index 與 left_index同時使用.即根據兩個結構的index進行merge.
  1. suffixes : tuple of (str, str), default (‘_x’, ‘_y’)
    Suffix to apply to overlapping column names in the left and right side, respectively. To raise an exception on overlapping columns use (False, False).
    • suffixes 主要用于解決兩個合并結構的列存在交叉的情況.
    • 通過suffixes 的指定,名字相同可以在merge后使用不同的列名,并同時存在.

代碼:

In:df1 = pd.DataFrame({'A':['A0','A1','A2'],'B':['B0','B1','B2']},index=['KO','K1','K2'])
   df2 = pd.DataFrame({'C':['C0','C2','C3'],'D':['D0','D2','D3']},index=['KO','K1','K2'])

In: df1
Out:    
        A    B
  KO    A0  B0
  K1    A1  B1
  K2    A2  B2

In: df1
Out: 
     C   D
KO  C0  D0
K1  C2  D2
K2  C3  D3
# 打開left_index 和 right_index ,how='inner'即根據行進行merge, 合并的類型是采用交叉部分(index部分的交叉)進行合并.
In: res = pd.merge(df1,df2,left_index=True,right_index=True,how='inner')
In: res
Out: 
     A  B   C   D
KO  A0  B0  C0  D0
K1  A1  B1  C2  D2
K2  A2  B2  C3  D3
In: df1 = pd.DataFrame({'lkey1':['foo','bar','baz','foo'],'value':[1,2,3,4],'rkey':['ab','bc','cd','ef']})
    df2 = pd.DataFrame({'rkey': ['foo', 'bar', 'baz', 'foooo'],'value': [4, 6, 7, 8],'xxx':[1,23,4,5]})
In: df1
Out: 
    lkey1   value   rkey
0   foo       1     ab
1   bar       2     bc
2   baz       3     cd
3   foo       4     ef

In: df2
Out: 
    rkey    value   xxx
0   foo       4     1
1   bar       6     23
2   baz       7     4
3   foooo     8     5

# 基于value鍵,使用left類型進行合并.合并結果中的value只采用df1中value值,對于df2中不存在value值對應行的情況直接填充NaN(例如value1/2/3)
In: pd.merge(df1,df2,how='left',on = 'value')
Out: 
    lkey1   value   rkey_x  rkey_y  xxx
0   foo        1    ab       NaN    NaN
1   bar        2    bc       NaN    NaN
2   baz        3    cd       NaN    NaN
3   foo        4    ef       foo    1.0

注意到在上一段代碼的運行結果中,重疊部分即rkey列,在融合后自動添加了x和y后綴,避免了重疊.這里也可以利用suffixes對后綴進行指定

In:  boys = pd.DataFrame({'k':['K0','K1','K2'],'age':['1','2','3'],'name':['b1','b2','b3']})
     girls = pd.DataFrame({'k':['K0','K0','K3'],'age':['4','5','6'],'name':['g1','g2','g3']})
In: boys
Out: 
    k   age name
0   K0  1   b1
1   K1  2   b2
2   K2  3   b3

In: girls
Out: 

    k   age name
0   K0  4   g1
1   K0  5   g2
2   K3  6   g3

# 針對name和age列存在重疊情況. 使用suffixes指明了后綴
In: pd.merge(boys,girls,suffixes=['_boys','_girls'],on = 'k',how=  'inner')
Out:

     k    age_boys  name_boys   age_girls   name_girls
0   K0        1       b1          4         g1
1   K0        1       b1          5         g2

In: pd.merge(boys,girls,suffixes=['_boys','_girls'],on = ['k','age'] ,how=  'left')
Out:

      k         age  name_boys  name_girls
0     K0          1   b1        NaN
1     K1          2   b2        NaN
2     K2          3   b3        NaN
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末施禾,一起剝皮案震驚了整個濱河市现拒,隨后出現的幾起案子罩引,更是在濱河造成了極大的恐慌慨仿,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機税产,發(fā)現死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來偷崩,“玉大人辟拷,你說我怎么就攤上這事』吩洌” “怎么了梧兼?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長智听。 經常有香客問我羽杰,道長渡紫,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任考赛,我火速辦了婚禮惕澎,結果婚禮上,老公的妹妹穿的比我還像新娘颜骤。我一直安慰自己唧喉,他們只是感情好,可當我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布忍抽。 她就那樣靜靜地躺著八孝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鸠项。 梳的紋絲不亂的頭發(fā)上干跛,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音祟绊,去河邊找鬼楼入。 笑死,一個胖子當著我的面吹牛牧抽,可吹牛的內容都是我干的嘉熊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼扬舒,長吁一口氣:“原來是場噩夢啊……” “哼阐肤!你這毒婦竟也來了?” 一聲冷哼從身側響起呼巴,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤泽腮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后衣赶,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡厚满,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年府瞄,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碘箍。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡遵馆,死狀恐怖,靈堂內的尸體忽然破棺而出丰榴,到底是詐尸還是另有隱情货邓,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布四濒,位于F島的核電站换况,受9級特大地震影響职辨,放射性物質發(fā)生泄漏。R本人自食惡果不足惜戈二,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一舒裤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧觉吭,春花似錦腾供、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至徙硅,卻和暖如春黎侈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背闷游。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工峻汉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脐往。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓休吠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親业簿。 傳聞我的和親對象是個殘疾皇子瘤礁,可洞房花燭夜當晚...
    茶點故事閱讀 44,592評論 2 353