Pandas简明教程:九、表的合并、连接、拼接(数据聚合基础)
真實場景中常會遇到多種信息放在不同的表里的情況,此時我們就需要將這些表格的信息整合到一起。這種操作可以極大地減輕我們手動粘數據的工作,從而達到事半功倍的效果。
由于本篇要舉的例子較多,因此直接采用官網數據進行說明。
1、簡單合并方法
首先給定三個表:
df1A B C D 0 A0 B0 C0 D0 1 A1 B1 C1 D1 2 A2 B2 C2 D2 3 A3 B3 C3 D3df2A B C D 4 A4 B4 C4 D4 5 A5 B5 C5 D5 6 A6 B6 C6 D6 7 A7 B7 C7 D7df3A B C D 8 A8 B8 C8 D8 9 A9 B9 C9 D9 10 A10 B10 C10 D10 11 A11 B11 C11 D11表中的表頭為A,B,C,D四列,每列中包含的數據不相同,此時對其直接進行合并。
frames = [df1, df2, df3]result = pd.concat(frames)resultA B C D 0 A0 B0 C0 D0 1 A1 B1 C1 D1 2 A2 B2 C2 D2 3 A3 B3 C3 D3 4 A4 B4 C4 D4 5 A5 B5 C5 D5 6 A6 B6 C6 D6 7 A7 B7 C7 D7 8 A8 B8 C8 D8 9 A9 B9 C9 D9 10 A10 B10 C10 D10 11 A11 B11 C11 D11可以看到,這種操作十分方便。
這個看似簡單的操作在許多時候能夠起到大作用。比如我們統計一些學生的高考成績(剛好4列),這些學生的高考成績按照學校、班級存在許多個不同的文件中。那么此時我們可以結合os的方法將所有表格依次讀出再合并為一個表。想象一下比如有100張表格,那么我們只需要簡單幾句代碼就能全部合并起來。而手動操作的話光是打開、復制、粘貼就至少得1-2個小時才能完成,如果每張表頭的擺放順序不一樣還會花費更多的時間。
合并函數的定義是這樣的:
pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None,levels=None, names=None, verify_integrity=False, copy=True)其中objs即是要被合并的對象(可以是許多類型),詳細的說明可以直接查看官網,這里我們只挑最重要的問題進行講解。
2、選擇拼接方向
axis默認是0,可以理解為按行拼接。下面我們試試設為1:
result = pd.concat([df1, df2], axis=1, sort=False)resultA B C D A B C D 0 A0 B0 C0 D0 NaN NaN NaN NaN 1 A1 B1 C1 D1 NaN NaN NaN NaN 2 A2 B2 C2 D2 NaN NaN NaN NaN 3 A3 B3 C3 D3 NaN NaN NaN NaN 4 NaN NaN NaN NaN A4 B4 C4 D4 5 NaN NaN NaN NaN A5 B5 C5 D5 6 NaN NaN NaN NaN A6 B6 C6 D6 7 NaN NaN NaN NaN A7 B7 C7 D7可以看到,此時是將兩張表合并到了一起,并具有名稱相同的列,但它們各自對應的index還是原來的。
3、選擇拼接方式
直接對上面的兩張表做這樣一個操作:
result = pd.concat([df1, df2], axis=1, join='inner',sort=False)Empty DataFrame Columns: [A, B, C, D, A, B, C, D] Index: []這里要注意一個問題:當我們按照inner方式進行合并的時候,它是選擇兩個表共有的index或者column進行合并。而這里我們看到df1和df2并沒有共同的index,而此時又是按照橫向拼接的,因此結果為空。
為了方便敘述我們再造一張表,演示一下從不同方向的inner合并結果:
df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],'D': ['D2', 'D3', 'D6', 'D7'],'F': ['F2', 'F3', 'F6', 'F7']},index=[2, 3, 6, 7])result = pd.concat([df1, df4], axis=1, join='inner',sort=False)resultA B C D B D F 2 A2 B2 C2 D2 B2 D2 F2 3 A3 B3 C3 D3 B3 D3 F3result = pd.concat([df1, df4], axis=0, join='inner',sort=False)resultB D 0 B0 D0 1 B1 D1 2 B2 D2 3 B3 D3 2 B2 D2 3 B3 D3 6 B6 D6 7 B7 D7而其它的如重新分配key值、用append方法給表格添加數據等方法就相對容易理解了。有需要的同學直接查看文檔即可。
4、按照統一的key值合并
在實際應用場景中我們常會遇到這樣的情況:假設我手上有客戶的一些信息的表,但客戶的各類信息分散在不同的幾個表中,比如下面這種情況。
leftkey A B 0 K0 A0 B0 1 K1 A1 B1 2 K2 A2 B2 3 K3 A3 B3rightkey C D 0 K0 C0 D0 1 K1 C1 D1 2 K2 C2 D2 3 K3 C3 D3這里key列可以看作是客戶的編號,而A,B,C,D分別是客戶的各類信息。那么此時我們想要將這兩張表合并起來,就可以用下面的方法:
result = pd.merge(left, right, on='key')resultkey A B C D 0 K0 A0 B0 C0 D0 1 K1 A1 B1 C1 D1 2 K2 A2 B2 C2 D2 3 K3 A3 B3 C3 D3注意這個例子比較特殊,因為兩張表都有完全相同的key值,而真實場景中常常不能滿足這一條件,那么此時我們就要指定某張表作為主表。
這里我們先把右表的最后一行刪掉:
right = right.drop([3])key C D 0 K0 C0 D0 1 K1 C1 D1 2 K2 C2 D2再指定左表為主表:
result = pd.merge(left, right, how='left', on='key')resultkey A B C D 0 K0 A0 B0 C0 D0 1 K1 A1 B1 C1 D1 2 K2 A2 B2 C2 D2 3 K3 A3 B3 NaN NaN此時左表的所有key值就被保留了下來。
同理,如果以右表為主表,則只有右表的key值:
result = pd.merge(left, right, how='right', on='key')resultkey A B C D 0 K0 A0 B0 C0 D0 1 K1 A1 B1 C1 D1 2 K2 A2 B2 C2 D2注意:此時還有一種場景也是經常遇到的,就是每張表的key值都不完整,那么此時就用outer方法進行合并:
left = left.drop([0]) # 刪掉左表第一行,那么此時兩張表的key值就都不完整了result = pd.merge(left, right, how='outer', on='key')resultkey A B C D 0 K1 A1 B1 C1 D1 1 K2 A2 B2 C2 D2 2 K3 A3 B3 NaN NaN 3 K0 NaN NaN C0 D0相反,如果是用inner則取交集:
result = pd.merge(left, right, how='inner', on='key')resultkey A B C D 0 K1 A1 B1 C1 D1 1 K2 A2 B2 C2 D25、對比SQL
如果對SQL比較熟悉,那么學會Pandas的查詢方法則更加容易,由于官方已經給出了十分清楚的說明,這里就不再贅述,有興趣的同學可以自行查看:
Comparison with SQL
本系列教程教程完整目錄:
一、Pandas簡介與安裝
二、Pandas基本數據結構-DataFrame與Series
三、Pandas文件讀寫
四、Pandas數據索引方式
五、Pandas簡單統計操作及通用方式
六、Pandas條件查詢
七、Pandas缺失數據的處理(數據清洗基礎)
八、Pandas數據透視表
九、表的合并、連接、拼接(數據聚合基礎)
總結
以上是生活随笔為你收集整理的Pandas简明教程:九、表的合并、连接、拼接(数据聚合基础)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pandas简明教程:八、Pandas数
- 下一篇: 深度对比Python(Numpy,Sci