iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
自我挑戰組

Python資料分析學習地圖系列 第 5

Day 05 : 資料處理 Pandas (1)

excel 是很多人常用來處理報表與數據的工具,同樣地在 python 也有一個套件常常在處理這件事,就是我們今天的主角 Pandas。這個工具是很多人在做 python 資料分析的探索工具,有必要好好地學習熊貓!

導入套件

安裝方式

pandas 為第三方套件庫,記得先安裝後,通常還會安裝相依的套件庫 numpy

pip install numpy
pip install pandas

導入方式

numpy 和 pandas 均需要導入;大部分人習慣縮寫用 np 和 pd

import numpy as np
import pandas as pd

資料結構

Series

類似 list 的資料結構,可以自訂索引,是一個有索引值的一維陣列

s1 = pd.Series([0, 1, 2])
s1
s2 = pd.Series([0, 1, 2], index=[2, 7, 9])
s2

有屬性 values 和 index,可以使用

DataFrame

類似 excel 的資料結構,一樣有索引值,是有索引值的二維陣列。由於大家處理的資料大部分會是二維陣列,我會著重介紹 DataFrame 的操作。

創造數據

外部匯入

可以使用 csv、excel等等,每個方法可能有不同的默認值,使用者根據不同資料的格式進行參數調整。

df1 = pd.read_csv('file_path', header=1)
df2 = pd.read_excel('file_path', header=1)

自行創資料

當然也可以自己創建資料,會與 dict 搭配使用。 Dataframe 的格式就像 excel 一樣有行有列。

df1 = pd.DataFrame({"id": [0, 1, 2],
                    "student": ["Erik", "David", "Mary"],
                    "score": [85, 100, 70]})
df1

查看資料表

實際資料

拿到一個資料的時候,應該要先查看資料的實際狀況

# 不輸入數字預設查看5筆
df.head()
df.head(100)
df.tail()
# 顯示全部,但有時候會因為資料太多而被 pandas 用 ... 表示
df

預設瀏覽

後面的 None 是表示顯示全部,也可以更改為正整數
詳細請參考

  • 設定 column 顯示數量
    pd.set_option('display.max_columns', None)
    
  • 設定 column 寬度
    pd.set_option("max_colwidth", None)
    
  • 設定 row 顯示數量
    pd.set_option("max_rows", None)
    

查詢資料表訊息

可以得知該資料表的整理資訊,包含 not-null、資料維度、格式和所佔空間等等

df.info()


這邊要順便提醒 excel 轉 pandas 時,有些資料格式的轉換如果不是非預期,可能造成資料處理錯誤。因此需要先看看所有的欄位是不是有問題哦!

資料表基本操作

欄位

寫欄位的時候可以用中括號或是一點再加上名稱,但提醒一點加上名稱的方法可能會因為 df 有其他保留關鍵字而無法使用成功,中文也是不能用一點加上名稱。以下 dtypes 就是剛好 df 也有這個屬性會跟 df 本身的欄位可能會打架。

# 回傳 df 的 dtypes 欄位
df['dtypes']
# 回傳 df 的 dtypes 屬性
df.dtypes
# 回傳 df 的 名稱 欄位
df['名稱']
# 不能使用
df.名稱 

呼叫欄位

呼叫欄位名稱之後,通常會在轉成 list 以方便進行之後的操作

df.columns.tolist()

更改列名稱

key 值是舊名稱;value 值是新名稱

df.rename(columns={"Age": "new_age"})

資料維度

若要使用其中一個數據,可以搭配索引值,例如我想知道資料筆數就可以 df.shape[0],當然也可以直接用 len(df)

df.shape
>>> (891, 12)

重設索引值

如果有調整順序,通常會再重設索引值,避免之後迴圈順序有錯等等

df.reset_index(inplace=True)

指定索引值的資料

loc 前面是索引值,後面會接明確的文字

df.loc[0 ,'Age']

iloc 前後都會接索引值

df.iloc[0, 7]

資料操作

空值檢查

資料表會回傳每個數據是否為空值的布林值(另外也可以用 notnull() )

df.isnull()


或是檢查特定欄位

df['Age'].isnull()

加總用法

df['Age'].isnull().sum()

查看空值的方法

df[df['Age'].isnull()]

資料清洗

只要那一行有空值就會被踢掉

df.drop(how='any')

填充空值的方法,fillna 裡面放 Age 的平均值

value = df.Age.mean()
df.Age.fillna(value)

找重複值

刪除重複值,默認是保留第一筆看到的資料

df.Age.drop_duplicates()

資料計算

df.Sex.value_counts()

數據修改

可以簡單的全部加上某個數值

df['Age'] = df['Age'] + 1 

替換方法

df['Sex'] = df['Sex'].replace('male', 'M') 

使用 lambda 匿名函數達到更換的功效

df['Sex'] = df['Sex'].apply(lambda x: 'M' if x == 'male' else 'F')

也可以寫一個 function

def age_group(age):
    if age <= 20:
        return '20歲以下'
    elif age>=21 and age <=40 :
        return '21歲-40歲'
    elif age>=41 and age <=60 :
        return '41歲-60歲'
    elif age>=61 and age <=80 :
        return '61歲-80歲'
    elif age>=81 and age <=100 :
        return '81歲-100歲'
    elif age >=101:
        return '101歲以上'
    else:
        return 'error'

df['Age_Group'] = df.apply(lambda x: age_group(x['Age']), axis=1)

迴圈操作,但基本上會比 apply 慢

for index, row in df.iterrows():
    if row['Sex'] == 'male':
        df.loc[index, 'Sex'] = 'M'
    else:
        df.loc[index, 'Sex'] = 'F'

排序

ascending 默認值為 False,會採取升冪方式排序

df.sort_values(by=['Age'], ascending=False)

資料篩選

df[] 裡面可以放條件,讓 dataframe 去找尋合適的條件,另外後面可以選擇欄位(需要兩個中括號)

df[df['Age'] > 30][['Age', 'Survived']] 

用 and

df[(df['Age'] > 30) & (df['Embarked']=='S')] 

用 or

df[(df['Age'] > 30) | (df['Embarked']=='S')] 

也可以用 isin 篩選

df[df['Embarked'].isin(['S', 'C'])] 

上一篇
Day 04 : Python 基礎觀念 (3)
下一篇
Day 06 : 資料處理 Pandas (2)
系列文
Python資料分析學習地圖30

尚未有邦友留言

立即登入留言