iT邦幫忙

2

【python 大數據模組學習】pandas模組的快速導覽手冊

python中的pandas是好用的大數據處理工具,
pandas中有個相當好用的資料結構為dataFrame,
DataFrame則可以處理雙維度或多欄位的資料,
類似Excel的表格(Table),具有資料索引(列)及欄位標題(欄)

pandas模組本身已經自帶許多好用的資料處理函式庫,
而官方文件通常也有每個函式的用法說明,只是你可能不知道有哪些函式可以用而已,
這邊就來整理幾個較常見的用法,
簡稱增刪查改讀寫切併排

欲查詢函數用法,可至官方文檔-pandas.DataFrame查詢

如欲取得供練習使用的DataFrame,可參考【python 大數據模組學習】簡潔地創建隨機Dataframe供練習以生成dataframe

類別 簡介 常見函數
於dataFrame上新增多列(row)或多行(column)資料 append, insert
於dataFrame上刪除多列(row)或多行(column)資料,或過濾特定條件的資料 drop, dropna
查詢dataFrame某行某列或範圍內的資料,或依據條件篩選出部分資料 loc, iloc, at, iat
修改dataFrame的資料,或修改index, 欄位名稱 loc, iloc, at, iat, rename
讀取如csv, excel檔的資料,轉為dataFrame read_csv, read_excel
將dataFrame存為如csv, excel檔的資料格式 to_csv, to_excel
將dataFrame依條件分割為多個小的dataFrame groupby
合併多個資料表,或將兩個資料表依共同欄位做合併 concat, merge
將dataFrame依某個欄位的值做排序,或將index, 欄位名稱以指定順序重排 sort_values, reindex

pandas基礎概念介紹

這邊簡介pandas general會用到的觀念,
若需要用到什麼特別的功能再去官方文檔查一下即可

引用模組

習慣上,會加入這行引入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

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

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

這邊我們就利用【python 大數據模組學習】簡潔地創建隨機Dataframe供練習一文的介紹,生成練習用的dataframe吧

資料準備

為了不用每次都重新生出一個dataframe,我們把生成的資料存成csv檔

import pandas as pd
import numpy as np
mat = np.random.randint(0,100,size=(10, 2))
df = pd.DataFrame(mat, columns=["學號", "成績"])
df.to_csv('data.csv', encoding = 'big5', index = False)

範例dataframe(因是隨機生成,每個人生成的dataframe可能不同)

   學號  成績
0  72  62
1  84  74
2  96  11
3  57  17
4  59  10
5  82  15
6  52  30
7  68  46
8  35  95
9  16  91

讀取資料

我們再用pandas將剛剛生成的dataframe拿來練習

import pandas as pd
df = pd.read_csv('data.csv', encoding = 'big5')

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

print(df.iloc[[0,2], 0:2])
print(df.loc[[0,2], ['學號','成績']])

結果都會得到

   學號  成績
0  72  62
2  96  11

另外,at, iat則是取得單一位置的資料
譬如取得第1位同學的學號:

print(df.at[1, '學號'])
print(df.iat[1, 0])

都會得到

84

截取部分資料- 中括號

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

print(df['學號'])
print(df[['學號']])
print(df[['學號','成績']])

結果:

0    72
1    84
2    96
3    57
4    59
5    82
6    52
7    68
8    35
9    16
Name: 學號, dtype: int64

   學號
0  72
1  84
2  96
3  57
4  59
5  82
6  52
7  68
8  35
9  16

   學號  成績
0  72  62
1  84  74
2  96  11
3  57  17
4  59  10
5  82  15
6  52  30
7  68  46
8  35  95
9  16  91

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

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

print(df[4:7]) #取得第4~7(不包含7)的學生資料

結果:

   學號  成績
4  59  10
5  82  15
6  52  30

條件篩選(與numpy相似)

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

print(df['成績']>50)
print(df[df['成績']>50])

結果:

0     True
1     True
2    False
3    False
4    False
5    False
6    False
7    False
8     True
9     True
Name: 成績, dtype: bool

   學號  成績
0  72  62
1  84  74
8  35  95
9  16  91

資料行、列互換(與numpy的語法相同)

你可以用.T將dataframe的行、列互換
譬如:

change = df.T
print(change)

結果:

     0   1   2   3   4   5   6   7   8   9
學號  72  84  96  57  59  82  52  68  35  16
成績  62  74  11  17  10  15  30  46  95  91

尚未有邦友留言

立即登入留言