1. 數據表的處理
1.1 轉置數據表的行列
>>> import pandas as pd
>>> data = pd.read_csv('D:\git\python\code\第5章\產品統計表.csv')
>>> a = data.T
>>> print(a)
0 1 2 3 4 5 6
編號 a001 a002 a003 a004 a005 a006 a007
產品 背包 錢包 背包 手提包 錢包 單肩包 單肩包
成本價(元/個) 16 90 16 36 90 58 58
銷售價(元/個) 65 187 65 147 187 124 124
數量(個) 60 50 23 26 78 63 58
成本(元) 960 4500 368 936 7020 3654 3364
收入(元) 3900 9350 1495 3822 14586 7812 7192
利潤(元) 2940 4850 1127 2886 7566 4158 3828
1.2 將數據表轉換為樹形結構
將數據表轉換為樹形結構就是在維持二維表格的行標簽不變的情況下,把列標簽也變成行標簽,通俗來講,就是為二維表格建立層次化的索引。
>>> data = pd.read_excel('D:\git\python\code\第5章\產品統計表3.xlsx')
>>> print(data)
編號 產品 銷售價(元/個) 數量(個) 收入(元)
0 a001 背包 65.0 60.0 3900.0
1 a002 錢包 187.0 50.0 9350.0
2 a003 單肩包 124.0 58.0 7192.0
用stack()函數將上述數據表轉換為樹形結構。
>>> print(data.stack())
0 編號 a001
產品 背包
銷售價(元/個) 65.0
數量(個) 60.0
收入(元) 3900.0
1 編號 a002
產品 錢包
銷售價(元/個) 187.0
數量(個) 50.0
收入(元) 9350.0
2 編號 a003
產品 單肩包
銷售價(元/個) 124.0
數量(個) 58.0
收入(元) 7192.0
dtype: object
1.3 數據表的拼接
數據表的拼接是指將兩個或多個數據表合並為一個數據表,主要會用到pandas模塊中的merge()函數、concat()函數和append()函數。
merge()函數
>>> data1 = pd.read_excel('D:\git\python\code\第5章\產品表.xlsx', sheet_name=0)
>>> data2 = pd.read_excel('D:\git\python\code\第5章\產品表.xlsx', sheet_name=1)
>>> print(data1)
員工編號 員工姓名 員工性別
0 a001 張三 男
1 a002 李四 女
2 a003 王五 男
3 a004 趙六 男
>>> print(data2)
員工編號 員工姓名 銷售業績
0 a001 張三 360000.0
1 a002 李四 458000.0
2 a003 王五 369000.0
3 a004 趙六 450000.0
4 a005 錢七 500000.0
>>> print(pd.merge(data1,data2))
員工編號 員工姓名 員工性別 銷售業績
0 a001 張三 男 360000.0
1 a002 李四 女 458000.0
2 a003 王五 男 369000.0
3 a004 趙六 男 450000.0
>>> print(pd.merge(data1,data2,how='outer'))
員工編號 員工姓名 員工性別 銷售業績
0 a001 張三 男 360000.0
1 a002 李四 女 458000.0
2 a003 王五 男 369000.0
3 a004 趙六 男 450000.0
4 a005 錢七 NaN 500000.0
想合並兩個表的所有數據,則需要為merge()函數添加參數how,並設置其值為'outer'。
如果兩個表中相同的列標簽不止一個,可以利用參數on來指定依據哪一列進行合並操作。
>>> print(pd.merge(data1,data2,on='員工編號'))
員工編號 員工姓名_x 員工性別 員工姓名_y 銷售業績
0 a001 張三 男 張三 360000.0
1 a002 李四 女 李四 458000.0
2 a003 王五 男 王五 369000.0
3 a004 趙六 男 趙六 450000.0
concat()函數
concat()函數采用的是全連接數據的方式,它可以直接將兩個或多個數據表合並,即不需要兩表的某些列或索引相同,也可以把數據整合到一起。
>>> print(pd.concat([data1,data2]))
員工編號 員工姓名 員工性別 銷售業績
0 a001 張三 男 NaN
1 a002 李四 女 NaN
2 a003 王五 男 NaN
3 a004 趙六 男 NaN
0 a001 張三 NaN 360000.0
1 a002 李四 NaN 458000.0
2 a003 王五 NaN 369000.0
3 a004 趙六 NaN 450000.0
4 a005 錢七 NaN 500000.0
合並后的表中每一行的行標簽仍然為原先兩個表各自的行標簽,如果想要重置行標簽,可以在concat()函數中設置參數ignore_index為True。
>>> print(pd.concat([data1,data2], ignore_index=True))
員工編號 員工姓名 員工性別 銷售業績
0 a001 張三 男 NaN
1 a002 李四 女 NaN
2 a003 王五 男 NaN
3 a004 趙六 男 NaN
4 a001 張三 NaN 360000.0
5 a002 李四 NaN 458000.0
6 a003 王五 NaN 369000.0
7 a004 趙六 NaN 450000.0
8 a005 錢七 NaN 500000.0
append()函數
append()函數的用法比較簡單,它可以直接將一個或多個數據表中的數據合並到其他數據表中。
data1.append(data2)
和 print(pd.concat([data1,data2])) 結果一樣
>>> g = data1.append({'員工編號':'a005','員工姓名':'孫七','員工性別':'男'}, ignore_index=True)
>>> print(g)
員工編號 員工姓名 員工性別
0 a001 張三 男
1 a002 李四 女
2 a003 王五 男
3 a004 趙六 男
4 a005 孫七 男
2. 數據的運算
有數據的統計運算、數值分布情況的獲取、相關系數的計算、數據的分組匯總、數據透視表的創建。
2.1 數據的統計運算
常見的統計運算包括求和、求平均值、求最值,分別要用到sum()函數、mean()函數、max()函數和min()函數。
求和
>>> data = pd.read_csv('D:\git\python\code\第5章\產品統計表.csv')
>>> print(data.sum())
編號 a001a002a003a004a005a006a007
產品 背包錢包背包手提包錢包單肩包單肩包
成本價(元/個) 364
銷售價(元/個) 899
數量(個) 358
成本(元) 20802
收入(元) 48157
利潤(元) 27355
dtype: object
>>> print(data['利潤(元)'].sum())
27355
對於非數值數據,運算結果是將它們依次連接得到的一個字符串;對於數值數據,運算結果才是數據之和。
求平均值、求最值
>>> print(data['利潤(元)'].mean())
3907.8571428571427
>>> print(data['利潤(元)'].max())
>>> data
編號 產品 成本價(元/個) 銷售價(元/個) 數量(個) 成本(元) 收入(元) 利潤(元)
0 a001 背包 16 65 60 960 3900 2940
1 a002 錢包 90 187 50 4500 9350 4850
2 a003 背包 16 65 23 368 1495 1127
3 a004 手提包 36 147 26 936 3822 2886
4 a005 錢包 90 187 78 7020 14586 7566
5 a006 單肩包 58 124 63 3654 7812 4158
6 a007 單肩包 58 124 58 3364 7192 3828
>>> data.min()
編號 a001
產品 單肩包
成本價(元/個) 16
銷售價(元/個) 65
數量(個) 23
成本(元) 368
收入(元) 1495
利潤(元) 1127
dtype: object
2.2 獲取數值分布情況
pandas模塊中的describe()函數可以按列獲取數據表中所有數值數據的分布情況,包括數據的個數、均值、最值、方差、分位數等。
>>> data.describe()
成本價(元/個) 銷售價(元/個) 數量(個) 成本(元) 收入(元) 利潤(元)
count 7.000000 7.000000 7.000000 7.000000 7.000000 7.000000
mean 52.000000 128.428571 51.142857 2971.714286 6879.571429 3907.857143
std 31.112698 50.483849 20.053500 2391.447659 4352.763331 2002.194498
min 16.000000 65.000000 23.000000 368.000000 1495.000000 1127.000000
25% 26.000000 94.500000 38.000000 948.000000 3861.000000 2913.000000
50% 58.000000 124.000000 58.000000 3364.000000 7192.000000 3828.000000
75% 74.000000 167.000000 61.500000 4077.000000 8581.000000 4504.000000
max 90.000000 187.000000 78.000000 7020.000000 14586.000000 7566.000000
>>> data['利潤(元)'].describe()
count 7.000000
mean 3907.857143
std 2002.194498
min 1127.000000
25% 2913.000000
50% 3828.000000
75% 4504.000000
max 7566.000000
Name: 利潤(元), dtype: float64
2.3 計算相關系數
相關系數通常用來衡量兩個或多個元素之間的相關程度,使用pandas模塊中的corr()函數可以計算相關系數。
>>> data = pd.read_excel('D:\git\python\code\第5章\相關性分析.xlsx')
>>> print(data)
代理商編號 年銷售額(萬元) 年廣告費投入額(萬元) 成本費用(萬元) 管理費用(萬元)
0 A-001 20.5 15.6 2.00 0.80
1 A-003 24.5 16.7 2.54 0.94
2 B-002 31.8 20.4 2.96 0.88
3 B-006 34.9 22.6 3.02 0.79
4 B-008 39.4 25.7 3.14 0.84
5 C-003 44.5 28.8 4.00 0.80
6 C-004 49.6 32.1 6.84 0.85
7 C-007 54.8 35.9 5.60 0.91
8 D-006 58.5 38.7 6.45 0.90
>>> data.corr()
年銷售額(萬元) 年廣告費投入額(萬元) 成本費用(萬元) 管理費用(萬元)
年銷售額(萬元) 1.000000 0.996275 0.914428 0.218317
年廣告費投入額(萬元) 0.996275 1.000000 0.918404 0.223187
成本費用(萬元) 0.914428 0.918404 1.000000 0.284286
管理費用(萬元) 0.218317 0.223187 0.284286 1.000000
如果只想查看某一列與其他列的相關系數,可以用列標簽來指定列。
>>> data.corr()['年銷售額(萬元)']
年銷售額(萬元) 1.000000
年廣告費投入額(萬元) 0.996275
成本費用(萬元) 0.914428
管理費用(萬元) 0.218317
Name: 年銷售額(萬元), dtype: float64
2.4 分組匯總數據
pandas模塊中的groupby()函數可以對數據進行分組。
>>> data = pd.read_csv('D:\git\python\code\第5章\產品統計表.csv')
>>> data
編號 產品 成本價(元/個) 銷售價(元/個) 數量(個) 成本(元) 收入(元) 利潤(元)
0 a001 背包 16 65 60 960 3900 2940
1 a002 錢包 90 187 50 4500 9350 4850
2 a003 背包 16 65 23 368 1495 1127
3 a004 手提包 36 147 26 936 3822 2886
4 a005 錢包 90 187 78 7020 14586 7566
5 a006 單肩包 58 124 63 3654 7812 4158
6 a007 單肩包 58 124 58 3364 7192 3828
>>> data.groupby('產品')['數量(個)','利潤(元)'].sum()
數量(個) 利潤(元)
產品
單肩包 121 7986
手提包 26 2886
背包 83 4067
錢包 128 12416
2.5 創建數據透視表
數據透視表可對數據表中的數據進行快速分組和計算。pandas模塊中的pivot_table()函數可以制作數據透視表。
>>> pd.pivot_table(data, values=['利潤(元)','成本(元)'], index='產品', aggfunc='sum')
利潤(元) 成本(元)
產品
單肩包 7986 7018
手提包 2886 936
背包 4067 1328
錢包 12416 11520
>>> pd.pivot_table(data, values=['利潤(元)','成本(元)'], index=['產品','編號'], aggfunc='sum')
利潤(元) 成本(元)
產品 編號
單肩包 a006 4158 3654
a007 3828 3364
手提包 a004 2886 936
背包 a001 2940 960
a003 1127 368
錢包 a002 4850 4500
a005 7566 7020