[Python] Pandas 數據表的處理和數據運算


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM