---
# System prepended metadata

title: A Little Learning Everyday about Pandas_01-快速認識Pandas(1)

---

# A Little Learning Everyday about Pandas_01-快速認識Pandas(1)
###### `a little learning everyday` `pandas`

>每天學一點，一天不要學太多東西，這是楊千教授在課堂上說過的一句話，個人覺得跟賴世雄老師的少就是多，慢就是快有異曲同工之妙。

Pandas，尖端科技的結晶，也是一套資料分析、處理，不可少的工具。而且新的版本也已經跟matplotlib有了深度的結合，你可以直接在Pandas上可視化你的資料，非常便利。

雖然之前已經有看過[課程](https://github.com/shaoeChen/pandas_foundation)，不過版本愈來愈新，還是需要再找時間重新複習一下。每天學一點，記錄一點，總是可以再重溫這整個套件的常用功能。

做機器學習除了演算法之外就是資料預處理以及資料清洗，這些部份你就可以利用Pandas來做，不難，難的在於你要做什麼還有你應該做什麼。至於資料的取得就現在來說已經不是什麼難事了，隨便找一個公開資料就開始練習吧。

## 載入資料
載入pandas的方式，就跟載入numpy一樣，都是一個約定俗成：
```python=
import pandas as pd
```

如果我們想要載入一個資料集，那可以利用`pd.read_xxx`，很明顯的這個`xxx`就是看你的格式是什麼，以我這邊範例要用的是csv檔，那就：
```python=
df = pd.read_csv('https://dts.twse.com.tw/opendata/t187ap14_L.csv')
```

你可以參考[官方文件](https://pandas.pydata.org/pandas-docs/stable/reference/io.html)取得更多的io方法。

## 確認資料
載入資料之後必需先確認資料是否正確的載入，這時候有三種常見方式可以處理，那就是`df.head(5)`、`df.tile(5)`、`df.sample(5)`，這三種方法分別是取前五筆、取後五筆、隨機取五筆：
![](https://hackmd.io/_uploads/SJ0IGdhv9.png)

上圖我做的是隨機取五筆，當你取的到資料就意味著你的資料載入至少是正確的。

接下來也許你會希望可以知道整個資料集究竟有多少筆資料，常見的作法我們是可以直接使用`len(df)`，潮一點的當然也可以使用`df.shape`，採用`df.shape`的好處在於你可以直接知道你的資料維度，也就是總共幾筆，有幾個欄位(或者你也想稱之為特徵)。

在確認資料維度之後，也許你會希望知道各欄位的型別，`df.dtypes`是個不錯的作法，但是利用`df.info()`得到的資訊更為全面，包含型別、是否存在空值以及記憶體用量等資訊皆有：
![](https://hackmd.io/_uploads/HyjJF5hDc.png)

當然你一定也知道還有一個函數為`df.describe()`，這函數主要是提供四分位數、中位數、平均值等資訊，想當然，只針對數值型別的欄位會有效果，因此你也可以發現上下兩張圖的欄位數是不一樣多得：
![](https://hackmd.io/_uploads/Bka9tc2P9.png)

不過如果你只是單純的需要知道有幾個欄位的話，你就直接利用`df.columns`就可以取得所有欄位名稱了。

## 選取資料

pandas在選取資料的部份還蠻直觀的，就跟你在使用dict一樣，假設我們選取『年度』這個欄位的所有資料，只需要`df['年度']`：
![](https://hackmd.io/_uploads/SJBvq9hPq.png)

它回傳的是個`series`型別的物件，上圖第一個column你看到的就是index，第二個column就是年度的值。

當然你也可以一次選擇多個欄位，也許你會想要`df[['xxx', 'xxx']]`的方式，但是我個人是比較偏愛這樣：
```python=
_cols = ['年度', '季別']
df[_cols]
```

我們剛剛說到可以利用`df.shape`來看資料維度，所以你也可以利用`df.loc`與`df.iloc`來做像numpy一樣的維度選取，差別在於`df.loc`是指定欄位，而`df.iloc`是指定索引：

<center class='half'>
    <img src='https://hackmd.io/_uploads/Sym9o92P9.png' width='300'/>
    <img src='https://hackmd.io/_uploads/H1gss53v5.png' width='300'/>
</center> 

上面兩張圖可以得到一樣的結果，但是使用的語法是不一樣的。

不指定欄位只想取前100筆的資料的話，除了用`df.head(100)`之外，你也可以採用`df[0:100]`的方式，結果是一樣的。

### 設置索引選取
剛剛我們提到，呈現的第一個column代表的是索引，這當然可以指定，我們可以利用`df.set_index('產業別', inplace=True)`來指定，`inplace=True`代表的意義就是『確認改變』，也就是你的這個DataFrame的索引就會確實的變成你所指定的欄位，沒有加這個option的話，充其量就是給你看一下改變之後的結果。

這時候我們再回頭執行`df.loc['水泥工業', _cols]`，這個`_cols`就是上面我設置的欄位，可以得到指定索引後的結果：
![](https://hackmd.io/_uploads/BkHvC9nwc.png)

你說，那我們是否可以指定多個索引？這是肯定的，觀念一樣，只需要用一個list塞入你想指定的索引就行，就像這樣`df.loc[['水泥工業', '紡織纖維'], _cols]`。

當你希望取消索引設置的時候，不用客氣，直接`df.reset_index(inplace=True)`，不要忘了`inplace=True`
### 設置條件選取
有些時候我們希望可以有條件的選取資料，當然你可以給一個很直接的語法，像是`df[df['產業別']=='水泥工業']`，只是我的習慣還是一樣會拆開處理，像這樣：
```python=
mask = df['產業別']=='水泥工業'
df[mask]
```

對我來說這樣比較直觀就是，因為多個條件的話我的作法看起來可以比較清楚一點，個人自我感覺良好就是：
![](https://hackmd.io/_uploads/Hkhixjhv9.png)

## 結論
今天學到的雖然少少的，但是少就是多，慢就是快。我們至少已經知道怎麼載入資料，也知道怎麼選取資料，當然還有很多，像是群組、排序、還有怎麼可視化資料，但是不急，一天不要學太多東西，每天只要學一點，多練習才是重點，有個觀念在，以後遇到問題至少可以知道怎麼處理。
