iT邦幫忙

1

【python好用模組-pandas】好用的資料處理工具

哈囉~ 大家好,今天自己學習的目標是pandas,
根據網路資料[資料分析&機器學習] 第2.3講:Pandas 基本function介紹(Series, DataFrame, Selection, Grouping)所述,
Pandas就是把Excel的表格觀念丟到Python,
可以將Excel的操作都可以透過Pandas的函式做簡單的處理

不過我自己不是很熟悉excel,
就直接學看看pandas,
感受一下它的好用之處吧

為了避免因版本差異造成執行結果不同,
附上小馬的版本資訊:
Spyder->python3.7
pandas版本0.23.4

安裝

pandas不是python的內建模組,
但如果你是直接安裝anaconda 的話,
那pandas也已經裝好了,不必再額外安裝

引用模組

習慣上,會加入這行引入pandas模組

import pandas as pd

大家慣用的縮寫是pd,就像numpy大家慣用的縮寫是np一樣

創建資料

我的理解是pandas中的資料大致分兩種形態:

  1. Series 欄位(一維度)
  2. DataFrame 表格(二維度)
    (三維以上的表格似乎不常用,先略過)

Series 欄位

在pandas中創建Series很簡單,把一個list放進去就可以了,
index預設是0,1,2,3,…
範例:

import pandas as pd
L = list(range(1,20,3))
s1 = pd.Series(L)
print(s1)

結果:

0     1
1     4
2     7
3    10
4    13
5    16
6    19
dtype: int64

要指定index的話也很簡單,
pd.Series()多加一個index參數放list即可
範例:

import pandas as pd
L = list(range(1,20,3))
s1 = pd.Series(L, index = [chr(ord('a')+i) for i in range(7)])
print(s1)

結果:

a     1
b     4
c     7
d    10
e    13
f    16
g    19
dtype: int64

還有一招,直接給一個dict當作pd.Series()的參數
範例:

import pandas as pd
s1 = pd.Series({'小狗': 50, '小貓': 60, '小熊': 25})
print(s1)

結果:

小狗    50
小貓    60
小熊    25
dtype: int64

DataFrame 表格

要創建DataFrame有兩種方法,
總之就是dict加list的組合

import pandas as pd
scores = [{"姓名":"小華", "數學":90, "國文":80},
          {"姓名":"小明", "數學":70, "國文":55},
          {"姓名":"小李", "數學":45, "國文":75}]
score_df = pd.DataFrame(scores)
print(score_df)

scores = {"姓名":["小華","小明","小李"],
          "國文":[80,55,75],
          "數學":[90,70,45]}
score_df = pd.DataFrame.from_dict(scores)
print(score_df)

結果:

   國文  姓名  數學
0  80  小華  90
1  55  小明  70
2  75  小李  45
   姓名  國文  數學
0  小華  80  90
1  小明  55  70
2  小李  75  45

讀取csv資料

通常,我們可能會需要讀取資料,
而非由程式自己生成資料,
可以用pd.read_csv()指令讀取csv檔案,
這裡需特別注意,
如果你的資料是包含中文的,
必須將檔案存成utf8編碼,否則讀檔會出錯

範例:

import pandas as pd
scores = pd.read_csv('scores.csv', index_col = 0)
print(scores)

結果:

   名字     學號  分數
0  小玥  49852  50
1  小明  15605  25
2  小芸  55696  56
3  小琥  56983  89

其中我的scores.csv檔為:
https://ithelp.ithome.com.tw/upload/images/20200623/20117114L9Si9N4Rcd.png

目前自己產生檔案的方法比較笨,
先透過excel存一個csv檔,
再透過文字編輯器EmEditer轉存成utf8編碼

截取部分資料- loc, iloc, at, iat

我覺得這部分與python的切片語法與numpy是蠻相似的,
pandas的取值有四種方法- loc, iloc, at, iat,
i是index的意思。沒有i的則是直接以index名稱取值

一樣用上面的資料,

   名字     學號  分數
0  小玥  49852  50
1  小明  15605  25
2  小芸  55696  56
3  小琥  56983  89

譬如說這邊想要取第0個學生和第2個學生的名字和學號好了,
可以這樣做:

import pandas as pd
scores = pd.read_csv('scores.csv', index_col = 0)
print(scores.iloc[[0,2], 0:2])
print(scores.loc[[0,2], ['名字', '學號']])

結果都會得到

   名字     學號
0  小玥  49852
2  小芸  55696

另外,at, iat則是取得單一位置的資料
譬如

import pandas as pd
scores = pd.read_csv('scores.csv', index_col = 0)
print(scores.at[1, '名字'])
print(scores.iat[1, 0])

都會得到

小明

截取部分資料- 中括號

我發現pandas直接使用中括號(沒有用loc, iloc, at, iat)有兩種涵義
第一種是取得column的資料,譬如:

import pandas as pd
scores = pd.read_csv('scores.csv', index_col = 0)
print(scores['名字'])
print(scores[['名字']])
print(scores[['名字', '學號']])

結果:

0    小玥
1    小明
2    小芸
3    小琥
Name: 名字, dtype: object

   名字
0  小玥
1  小明
2  小芸
3  小琥

   名字     學號
0  小玥  49852
1  小明  15605
2  小芸  55696
3  小琥  56983

你若在中括號內放一個字串,回傳是的一個Series
若放入一個list,回傳的則是一個DataFrame

第二個方法則是用python的切片語法,譬如說
例如:

import pandas as pd
scores = pd.read_csv('scores.csv', index_col = 0)
print(scores[0:2]) #取得第0~2(不包含2)個學生的資料

結果:

   名字     學號  分數
0  小玥  49852  50
1  小明  15605  25

條件篩選(與numpy相似)

pandas亦可以指定將滿足條件的資料篩選出來,
譬如說指定將分數大於50分的同學選出來

import pandas as pd
scores = pd.read_csv('scores.csv', index_col = 0)
print(scores[scores['分數']>50])

結果:

   名字     學號  分數
2  小芸  55696  56
3  小琥  56983  89

資料行、列互換

一般來說,pandas的row的索引是0,1,2,3,
column則會記錄「屬性」,
如果你的原始資料的行列反過來了,
可以用.T取得轉置(跟numpy的語法也一樣),
譬如:

import pandas as pd
scores = pd.read_csv('scores.csv', index_col = 0)
print(scores.T)

結果:

        0      1      2      3
名字     小玥     小明     小芸     小琥
學號  49852  15605  55696  56983
分數     50     25     56     89

輸出excel檔

將pandas的DataFrame輸出為excel檔的指令也很簡單,
.to_excel('檔案名稱.xls')就好了,
範例:

import pandas as pd
scores = pd.read_csv('scores.csv', index_col = 0)
scores.to_excel('table.xls')

就先寫到這邊吧,
如果有想到什麼需要的再補充

參考資料

  1. 由 Pandas 的 DataFrame 中取得資料
  2. Python Pandas 基本操作教學_成績表
  3. [資料分析&機器學習] 第2.3講:Pandas 基本function介紹(Series, DataFrame, Selection, Grouping)

尚未有邦友留言

立即登入留言