第5章 精通pandas合併操作(使用pandas進行數據分析,從小白逆襲大神,你會了嗎?)

第5章 合併

import numpy as np
import pandas as pd
df = pd.read_csv('data/table.csv')
df.head()

在這裏插入圖片描述

一、append與assign

1. append方法

(a)利用序列添加行(必須指定name)

df_append = df.loc[:3,['Gender','Height']].copy()
df_append

在這裏插入圖片描述

s = pd.Series({'Gender':'F','Height':188},name='new_row')
df_append.append(s)

在這裏插入圖片描述
(b)用DataFrame添加表

df_temp = pd.DataFrame({'Gender':['F','M'],'Height':[188,176]},index=['new_1','new_2'])
df_append.append(df_temp)

在這裏插入圖片描述

2. assign方法

該方法主要用於添加列,列名直接由參數指定:

s = pd.Series(list('abcd'),index=range(4))
df_append.assign(Letter=s)

在這裏插入圖片描述
可以一次添加多個列:

df_append.assign(col1=lambda x:x['Gender']*2,
                 col2=s)

在這裏插入圖片描述

二、combine與update

1. comine方法

comine和update都是用於表的填充函數,可以根據某種規則填充

(a)填充對象

可以看出combine方法是按照表的順序輪流進行逐列循環的,而且自動索引對齊,缺失值爲NaN,理解這一點很重要

df_combine_1 = df.loc[:1,['Gender','Height']].copy()
df_combine_1
df_combine_2 = df.loc[10:11,['Gender','Height']].copy()
df_combine_1.combine(df_combine_2,lambda x,y:print(x,y))

在這裏插入圖片描述
(b)一些例子

例①:根據列均值的大小填充

# 例子1
df1 = pd.DataFrame({'A': [1, 2], 'B': [3, 4]})
df2 = pd.DataFrame({'A': [8, 7], 'B': [6, 5]})
df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y)

在這裏插入圖片描述
例②:索引對齊特性(默認狀態下,後面的表沒有的行列都會設置爲NaN)

df2 = pd.DataFrame({'B': [8, 7], 'C': [6, 5]},index=[1,2])
df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y)

在這裏插入圖片描述
例④:在新增匹配df2的元素位置填充-1

df1.combine(df2,lambda x,y:x if x.mean()>y.mean() else y,fill_value=-1)

在這裏插入圖片描述
(c)combine_first方法

這個方法作用是用df2填補df1的缺失值,功能比較簡單,但很多時候會比combine更常用,下面舉兩個例子:

df1 = pd.DataFrame({'A': [None, 0], 'B': [None, 4]})
df2 = pd.DataFrame({'A': [1, 1], 'B': [3, 3]})
df1.combine_first(df2)

在這裏插入圖片描述

df1 = pd.DataFrame({'A': [None, 0], 'B': [4, None]})
df2 = pd.DataFrame({'B': [3, 3], 'C': [1, 1]}, index=[1, 2])
df1.combine_first(df2)

在這裏插入圖片描述

2. update方法

(a)三個特點

①返回的框索引只會與被調用框的一致(默認使用左連接,下一節會介紹)

②第二個框中的nan元素不會起作用

③沒有返回值,直接在df上操作

(b)例子

例①:索引完全對齊情況下的操作

df1 = pd.DataFrame({'A': [1, 2, 3],
                    'B': [400, 500, 600]})
df2 = pd.DataFrame({'B': [4, 5, 6],
                    'C': [7, 8, 9]})
df1.update(df2)
df1

在這裏插入圖片描述
例②:部分填充

df1 = pd.DataFrame({'A': ['a', 'b', 'c'],
                    'B': ['x', 'y', 'z']})
df2 = pd.DataFrame({'B': ['d', 'e']}, index=[1,2])
df1.update(df2)
df1

在這裏插入圖片描述
例③:缺失值不會填充

df1 = pd.DataFrame({'A': [1, 2, 3],
                    'B': [400, 500, 600]})
df2 = pd.DataFrame({'B': [4, np.nan, 6]})
df1.update(df2)
df1

在這裏插入圖片描述

三、concat方法

concat方法可以在兩個維度上拼接,默認縱向憑藉(axis=0),拼接方式默認外連接

所謂外連接,就是取拼接方向的並集,而’inner’時取拼接方向(若使用默認的縱向拼接,則爲列的交集)的交集

下面舉一些例子說明其參數:

df1 = pd.DataFrame({'A': ['A0', 'A1'],
                    'B': ['B0', 'B1']},
                    index = [0,1])
df2 = pd.DataFrame({'A': ['A2', 'A3'],
                    'B': ['B2', 'B3']},
                    index = [2,3])
df3 = pd.DataFrame({'A': ['A1', 'A3'],
                    'D': ['D1', 'D3'],
                    'E': ['E1', 'E3']},
                    index = [1,3])

默認狀態拼接:

pd.concat([df1,df2])

在這裏插入圖片描述
axis=1時沿列方向拼接:

pd.concat([df1,df2],axis=1)

在這裏插入圖片描述
join設置爲內連接(由於axis=0,因此列取交集):

pd.concat([df3,df1],join='inner')

在這裏插入圖片描述
join設置爲外鏈接:

 pd.concat([df3,df1],join='outer',sort=True) #sort設置列排序,默認爲False

在這裏插入圖片描述
verify_integrity檢查列是否唯一:

# pd.concat([df3,df1],verify_integrity=True,sort=True)  #報錯

同樣,可以添加Series:

s = pd.Series(['X0', 'X1'], name='X')
pd.concat([df1,s],axis=1)

在這裏插入圖片描述
key參數用於對不同的數據框增加一個標號,便於索引:

pd.concat([df1,df2], keys=['x', 'y'])
pd.concat([df1,df2], keys=['x', 'y']).index

在這裏插入圖片描述

四、merge與join

1. merge函數

merge函數的作用是將兩個pandas對象橫向合併,遇到重複的索引項時會使用笛卡爾積,默認inner連接,可選left、outer、right連接

所謂左連接,就是指以第一個表索引爲基準,右邊的表中如果不再左邊的則不加入,如果在左邊的就以笛卡爾積的方式加入

merge/join與concat的不同之處在於on參數,可以指定某一個對象爲key來進行連接

同樣的,下面舉一些例子:

left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                     'key2': ['K0', 'K1', 'K0', 'K1'],
                      'A': ['A0', 'A1', 'A2', 'A3'],
                      'B': ['B0', 'B1', 'B2', 'B3']}) 
right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                      'key2': ['K0', 'K0', 'K0', 'K0'],
                      'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']})
right2 = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                      'key2': ['K0', 'K0', 'K0', 'K0'],
                      'C': ['C0', 'C1', 'C2', 'C3']})
pd.merge(left, right, on='key1')

在這裏插入圖片描述
以多組鍵連接:

pd.merge(left, right, on='key1')

在這裏插入圖片描述
以多組鍵連接:

pd.merge(left, right, on=['key1','key2'])

在這裏插入圖片描述
默認使用inner連接,因爲merge只能橫向拼接,所以取行向上keys的交集,下面看如果使用how=outer參數

注意:這裏的how就是concat的join

pd.merge(left, right, how='outer', on=['key1','key2'])

在這裏插入圖片描述
左連接:

pd.merge(left, right, how='left', on=['key1', 'key2'])

在這裏插入圖片描述
右連接:

pd.merge(left, right, how='right', on=['key1', 'key2'])

在這裏插入圖片描述

如果還是對笛卡爾積不太瞭解,請務必理解下面這個例子,由於B的所有元素爲2,因此需要6行:

left = pd.DataFrame({'A': [1, 2], 'B': [2, 2]})
right = pd.DataFrame({'A': [4, 5, 6], 'B': [2, 2, 2]})
pd.merge(left, right, on='B', how='outer')

在這裏插入圖片描述
validate檢驗的是到底哪一邊出現了重複索引,如果是“one_to_one”則兩側索引都是唯一,如果"one_to_many"則左側唯一

left = pd.DataFrame({'A': [1, 2], 'B': [2, 2]})
right = pd.DataFrame({'A': [4, 5, 6], 'B': [2, 3, 4]})
#pd.merge(left, right, on='B', how='outer',validate='one_to_one') #報錯
left = pd.DataFrame({'A': [1, 2], 'B': [2, 1]})
pd.merge(left, right, on='B', how='outer',validate='one_to_one')

在這裏插入圖片描述
indicator參數指示了,合併後該行索引的來源

df1 = pd.DataFrame({'col1': [0, 1], 'col_left': ['a', 'b']})
df2 = pd.DataFrame({'col1': [1, 2, 2], 'col_right': [2, 2, 2]})
pd.merge(df1, df2, on='col1', how='outer', indicator=True) #indicator='indicator_column'也是可以的

在這裏插入圖片描述

2. join函數

join函數作用是將多個pandas對象橫向拼接,遇到重複的索引項時會使用笛卡爾積,默認左連接,可選inner、outer、right連接

left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],
                     'B': ['B0', 'B1', 'B2']},
                    index=['K0', 'K1', 'K2'])
right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],
                      'D': ['D0', 'D2', 'D3']},
                    index=['K0', 'K2', 'K3'])
left.join(right)

在這裏插入圖片描述
對於many_to_one模式下的合併,往往join更爲方便

同樣可以指定key:

left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3'],
                     'key': ['K0', 'K1', 'K0', 'K1']})
right = pd.DataFrame({'C': ['C0', 'C1'],
                      'D': ['D0', 'D1']},
                     index=['K0', 'K1'])
left.join(right, on='key')

在這裏插入圖片描述
多層key:

left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                     'B': ['B0', 'B1', 'B2', 'B3'],
                     'key1': ['K0', 'K0', 'K1', 'K2'],
                     'key2': ['K0', 'K1', 'K0', 'K1']})
index = pd.MultiIndex.from_tuples([('K0', 'K0'), ('K1', 'K0'),
                                   ('K2', 'K0'), ('K2', 'K1')],names=['key1','key2'])
right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],
                      'D': ['D0', 'D1', 'D2', 'D3']},
                     index=index)
left.join(right, on=['key1','key2'])

在這裏插入圖片描述

代碼和數據地址:https://github.com/XiangLinPro/pandas

另外博主收藏這些年來看過或者聽過的一些不錯的常用的上千本書籍,沒準你想找的書就在這裏呢,包含了互聯網行業大多數書籍和麪試經驗題目等等。有人工智能系列(常用深度學習框架TensorFlow、pytorch、keras。NLP、機器學習,深度學習等等),大數據系列(Spark,Hadoop,Scala,kafka等),程序員必修系列(C、C++、java、數據結構、linux,設計模式、數據庫等等)以下是部分截圖

更多文章見本原創微信公衆號「五角錢的程序員」,我們一起成長,一起學習。一直純真着,善良着,溫情地熱愛生活。關注回覆【電子書】即可領取哦

在這裏插入圖片描述

在這裏插入圖片描述

所有巧合的是要麼是上天註定要麼是一個人偷偷的在努力。

有收穫?希望老鐵們來個三連擊,給更多的人看到這篇文章

1、給俺點個讚唄,可以讓更多的人看到這篇文章,謝謝各位親。

2、親們,關注我的原創微信公衆號「五角錢的程序員」,我們一起成長,一起學習。一直純真着,善良着,溫情地熱愛生活。關注回覆【電子書】有很多資源哦。

給大家推薦一個Github,上面非常非常多的乾貨:https://github.com/XiangLinPro/IT_book

There’s much positivity as well as negativity in life. The key to one’s happiness is to seize those positive moments and enrich them,to convert those negative moments and remove them.

生命中有很多正向時刻,也有很多負向時刻。一個人快樂的祕訣,就是抓住那些正向時刻,使它更充盈;轉化負向的時刻,使它得到清洗。

關於Datawhale

Datawhale是一個專注於數據科學與AI領域的開源組織,彙集了衆多領域院校和知名企業的優秀學習者,聚合了一羣有開源精神和探索精神的團隊成員。Datawhale以“for the learner,和學習者一起成長”爲願景,鼓勵真實地展現自我、開放包容、互信互助、敢於試錯和勇於擔當。同時Datawhale 用開源的理念去探索開源內容、開源學習和開源方案,賦能人才培養,助力人才成長,建立起人與人,人與知識,人與企業和人與未來的聯結。

2020.5.18於城口

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章