pandas基础(part4)--排序/分组/合并
學習筆記,這個筆記以例子為主。
開發工具:Spyder
文章目錄
- pandas排序
- 按行標簽進行排序
- 按列標簽進行排序
- 按某列值排序
- 舉個例子
- pandas分組
- 將數據拆分成組
- 迭代遍歷分組
- 獲得子分組的細節
- 分組聚合
- 合并
- 合并兩個DataFrame
- 使用how參數合并DataFrame
pandas排序
pandas有兩種對DataFrame的排序方式,他們分別是按照標簽與按實際值排序。
按行標簽進行排序
使用sort_index()方法可以按照行/列標簽對DataFrame進行排序。默認情況下,按照升序對行標簽進行排序。
- 語法
按列標簽進行排序
若設置sort_index()的axis參數值為1,則會按照列標簽進行排序。
- 語法
按某列值排序
像索引排序一樣,sort_values()是按值排序的方法。該函數接受一個by參數,該參數的參數值為DataFrame的列名。
- 語法
舉個例子
代碼:
import pandas as pddata = {'name':['Ada', 'Tom','Black', 'Jack', 'Lee'],'age':[9, 19, 12, 15, 30],'weight':[8, 4, 5, 6, 10],'hight':[20, 35, 30, 33, 40]}df = pd.DataFrame(data, index = ['a1', 'a2', 'a3', 'a4', 'a5'])#按行降序排序 s01 = df.sort_index(ascending=False) print(s01) print('-'*20) #按列降序排序 s02 = df.sort_index(axis = 1, ascending=False) print(s02) print('-'*20) #按weight列升序排序 s03 = df.sort_values(by = 'weight') print(s03)結果:
age hight name weight a5 30 40 Lee 10 a4 15 33 Jack 6 a3 12 30 Black 5 a2 19 35 Tom 4 a1 9 20 Ada 8 --------------------weight name hight age a1 8 Ada 20 9 a2 4 Tom 35 19 a3 5 Black 30 12 a4 6 Jack 33 15 a5 10 Lee 40 30 --------------------age hight name weight a2 19 35 Tom 4 a3 12 30 Black 5 a4 15 33 Jack 6 a1 9 20 Ada 8 a5 30 40 Lee 10pandas分組
在許多情況下,我們需要將數據分為多個集合,并在每個子集上應用一些函數,來實現我們的需求。
將數據拆分成組
- 語法
- 例子
代碼:
import pandas as pddata = {'name':['Ada', 'Tom','Black', 'Jack', 'Lee', 'Yellow', 'Blue', 'Peter', 'Green', 'Trump'],'age':[9, 9, 10, 10, 10, 10, 8, 9, 7, 8],'weight':[8, 4, 5, 6, 10, 10, 4, 5, 4, 8]}df = pd.DataFrame(data, index = ['a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'a10'])print(df.groupby('age')) print(df.groupby('age').groups)結果:
<pandas.core.groupby.DataFrameGroupBy object at 0x000000D589A294A8> {7: Index(['a9'], dtype='object'), 8: Index(['a7', 'a10'], dtype='object'), 9: Index(['a1', 'a2', 'a8'], dtype='object'), 10: Index(['a3', 'a4', 'a5', 'a6'], dtype='object')}迭代遍歷分組
df.groupby()方法可以返回可迭代對象,可以使用for循環遍歷。
- 例子
代碼:
import pandas as pddata = {'name':['Ada', 'Tom','Black', 'Jack', 'Lee', 'Yellow', 'Blue', 'Peter', 'Green', 'Trump'],'age':[9, 9, 10, 10, 10, 10, 8, 9, 7, 8],'weight':[8, 4, 5, 6, 10, 10, 4, 5, 4, 8]}df = pd.DataFrame(data, index = ['a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'a10'])for age, i in df.groupby('age'):print(age)print(i)print('-'*10)結果:
7age name weight a9 7 Green 4 ---------- 8age name weight a7 8 Blue 4 a10 8 Trump 8 ---------- 9age name weight a1 9 Ada 8 a2 9 Tom 4 a8 9 Peter 5 ---------- 10age name weight a3 10 Black 5 a4 10 Jack 6 a5 10 Lee 10 a6 10 Yellow 10 ----------獲得子分組的細節
語法就不寫了,看下面的例子和注釋,應該就能懂。
- 例子
代碼:
import pandas as pddata = {'name':['Ada', 'Tom','Black', 'Jack', 'Lee', 'Yellow', 'Blue', 'Peter', 'Green', 'Trump'],'age':[9, 9, 10, 10, 10, 10, 8, 9, 7, 8],'weight':[8, 4, 5, 6, 10, 10, 4, 5, 4, 8]}df = pd.DataFrame(data, index = ['a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'a10'])# 將df數據框按照age字段分組 grouped = df.groupby('age') #查看age=8的分組的細節 print(grouped.get_group(8))結果:
age name weight a7 8 Blue 4 a10 8 Trump 8分組聚合
聚合函數為每個分組返回聚合值。當創建了分組(groupby)對象,就可以對每個分組數據執行求和、求標準差等操作。
語法就不寫了,看下面的例子和注釋,應該就能懂。
- 例子
代碼:
import numpy as np import pandas as pddatas = {'name':['Ada', 'Tom','Black', 'Jack', 'Lee', 'Yellow', 'Blue', 'Peter', 'Green', 'Trump'],'age':[9, 9, 10, 10, 10, 10, 8, 9, 7, 8],'weight':[8, 4, 5, 6, 10, 10, 4, 5, 4, 8]}df = pd.DataFrame(datas, index = ['a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'a10'])grouped = df.groupby('age') #print(grouped) #求出各個分組的均值 print (grouped.agg(np.mean)) print('-'*15) #求出各個分組的加總與標準差 print(grouped.agg([np.sum, np.std])) print('-'*15) #使用匿名函數lambda對各個分組進行操作 print(grouped.agg(lambda x: np.sum(x**2)))結果:
weight age 7 4.000000 8 6.000000 9 5.666667 10 7.750000 ---------------weight sum std age 7 4 NaN 8 12 2.828427 9 17 2.081666 10 31 2.629956 ---------------weight age 7 16 8 80 9 105 10 261合并
Pandas提供了merge()函數,作為DataFrame對象之間所有標準數據庫連接操作的入口。
合并兩個DataFrame
- 語法
- 例子
代碼:
import pandas as pdleftD = {'name':['Ada', 'Tom','Black', 'Jack', 'Lee', 'Yellow', 'Blue', 'Peter', 'Green', 'Trump'],'age':[9, 9, 10, 10, 10, 10, 8, 9, 7, 8],'weight':[8, 4, 5, 6, 10, 10, 4, 5, 4, 8],'Bunny_ld':[1, 2, 3, 4, 2, 4, 3, 1, 4, 1]}rightD = {'Bunny_ld':[1, 2, 3, 4],'foods':['A', 'B', 'C', 'D']}df_leftD = pd.DataFrame(leftD) df_rightD = pd.DataFrame(rightD)rs = pd.merge(df_leftD, df_rightD) print(rs)結果:
Bunny_ld age name weight foods 0 1 9 Ada 8 A 1 1 9 Peter 5 A 2 1 8 Trump 8 A 3 2 9 Tom 4 B 4 2 10 Lee 10 B 5 3 10 Black 5 C 6 3 8 Blue 4 C 7 4 10 Jack 6 D 8 4 10 Yellow 10 D 9 4 7 Green 4 D由結果可知,兩個數據框,通過同樣的變量Bunny_ld進行了關聯,合成了一個數據框。這種連接是內連接,若df_leftD數據框的Bunny_ld字段,存在df_rightD數據框的Bunny_ld字段所沒有的變量值時,則該觀測行會被丟掉,同樣,若df_rightD數據框的Bunny_ld字段,存在df_leftD數據框的Bunny_ld字段所沒有的觀測值時,該觀測行也會被扔掉。
故,我們還存在左連接(左邊Bunny_ld數據全保留)和右連接(右邊Bunny_ld數據全保留)兩種連接方式。我們可以設置merge()函數的how參數,來進行左連接/右連接。
使用how參數合并DataFrame
- 語法
how的其他參數值:
| left | 使用左側對象的鍵(左連接) |
| right | 使用右側對象的鍵(右連接) |
| outer | 使用鍵的聯合(外連接) |
| inner | 使用鍵的交集(內連接) |
- 例子(外連接)
代碼:
import pandas as pdleftD = {'name':['Ada', 'Tom','Black', 'Jack', 'Lee', 'Yellow', 'Blue', 'Peter', 'Green', 'Trump'],'age':[9, 9, 10, 10, 10, 10, 8, 9, 7, 8],'weight':[8, 4, 5, 6, 10, 10, 4, 5, 4, 8],'Bunny_ld':[1, 2, 3, 4, 2, 4, 3, 1, 4, 5]}rightD = {'Bunny_ld':[1, 2, 3, 4, 6],'foods':['A', 'B', 'C', 'D', 'E']}df_leftD = pd.DataFrame(leftD) df_rightD = pd.DataFrame(rightD)rs = pd.merge(df_leftD, df_rightD, how = 'outer') print(rs)結果:
Bunny_ld age name weight foods 0 1 9.0 Ada 8.0 A 1 1 9.0 Peter 5.0 A 2 2 9.0 Tom 4.0 B 3 2 10.0 Lee 10.0 B 4 3 10.0 Black 5.0 C 5 3 8.0 Blue 4.0 C 6 4 10.0 Jack 6.0 D 7 4 10.0 Yellow 10.0 D 8 4 7.0 Green 4.0 D 9 5 8.0 Trump 8.0 NaN 10 6 NaN NaN NaN E總結
以上是生活随笔為你收集整理的pandas基础(part4)--排序/分组/合并的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Canvas画椭圆的方法
- 下一篇: pandas基础(part5)--透视表