iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 8
3
Data Technology

使用Python進行資料分析系列 第 8

[Day08]Pandas資料的取得與篩選!

嗨,今天第八天了,最喜歡8這個數字了!(題外)
上一篇說明了如何讀取檔案還有pandas內的函式,包含查看資料內容、資料選擇、新增、刪除、空白填充以及排序。panda當然不只有這些功能,接下來我們就要來繼續探討它如何用之前所學到的運算子將做資料過濾,取得我們真正需要的資料。

若想看一下pandas的精彩(?)回顧:
[Day06]Pandas的兩種資料類型!
[Day07]Pandas操作資料的函數!

那就開始吧!

資料取得

這裡先複習一下資料的取得,會用到之前python運算元的觀念,
如果還是有困惑的地方,趕快看前兩天的pandas精彩(?)回顧,
放心,我會等你的(眼神堅定)。

Series

先來建立一個Series:

seriesObj = pd.Series(range(10),index=['a', 'a', 'b', 'b', 'b','c','c','c','c','c'])

建立一個範圍從0到9的資料並設定index,記得要用pandas前要先import pandas:

import pandas as pd

還記得上之前講過要如何取得要得數值吧?現在想看看下面這個程式碼會出現什麼結果?

seriesObj['c'] 

答案是輸出:

c    5
c    6
c    7
c    8
c    9
dtype: int64

Dataframe

現在我們再來試試看dataframe吧,建立一個dataframe:

df = pd.DataFrame(np.random.randn(4,2),index=['a', 'a', 'b', 'b'])

我們創建一個4✖️2的陣列,要引入一個叫做numpy的套件,這個我們之後會花時間解釋(敬請期待):

import numpy as np

只要知道它是用來建立矩陣的,接著我們隨機給予數值:

import numpy as np
df = pd.DataFrame(np.random.randn(4,2),index=['a', 'a', 'b', 'b'])
df

會看到輸出:
Imgur
現在若要取出row b的值,可以這樣做:

df.ix['b']

事不宜遲!進入資料篩選的部分吧!

資料篩選

要進入今天主要的部分了,今天要說明如何過濾資料只取得我們所要的數值,這就會用到我們之前在說明運算子的觀念了,

所以不熟悉python運算子的話先回去複習:
[Day03]Python的基本運算!(上)
[Day04]Python的基本運算!(下)

而我依然會在這裡等你的(眼神依然堅定)。

沒問題的話就繼續看下去吧!(let's go!)
Imgur

運算子運用

假設我現在要找出Gender為Male的員工我們可以用 == 判斷:

employees["Gender"] == "Male"

執行上面的程式碼可以看到若為Male則顯示True否則False,接著我們以這個當作過濾器:

fliter = (employees["Gender"] == "Male")
employees[fliter]

執行就可以看到顯示出來的員工資料都是男性的。

除了==當然也可以用!=像是:

mask = employees['Team'] != "Finance"

當然也可以用<,>像是:

employees["Salary"] > 148941
employees[employees["Salary"] > 148941]

用比較運算子就可以過濾並取得我們所要的數值,上面可顯示出薪水>148941的資料。
當然要在過濾日期也可以做到:

mask = employees["Start Date"] <= "1980-05-01"
employees[mask]

Imgur

假設我們想要過濾不只一個條件呢?記得布林運算子嗎?這時候就可以用上了!讓我們來看看吧!

mask1 = employees["Team"] != "Marketing"
mask2 = employees["Start Date"] < "1980-01-01"

上面這裡的程式中,我們設定mask1為team不為Marketing的資料,把mask2設定成開始日期小於1980-01-01的資料。

設定完遮罩之後我們就可以用布林運算子(and):

employees[(mask1 & mask2)] 

這樣就只會顯示mask1和mask2都成立的資料,當然也可以用或(or):

employees[(mask1 | mask2)] 

.isin()

除了運算子其實還有其他方法可以做到:

mask = employees["Team"].isin(["Legal","Scales","Product"])

就是上面的.isin()方法。

innull() & notnull()

上一篇我們提到如何將NaN的值刪除,我們來看innull()notnull()兩個方法吧!
isnull()如果值是空的就會顯示True

mask = employees["Team"].isnull()

notnull()如果值不是空的就會顯示True

mask = employees["Team"].notnull()

between()

上面提到可以用兩個比較運算子取出範圍,但其實還有一個方法可以取中間值就是.between()

employees[employees["Start Date"].between("2009-11-10","2010-01-20")]

使用.between("2009-11-10","2010-01-20")可以得到2009-11-10到2010-01-20間的數值。

employees[employees["Start Date"].between("2009-11-10","2010-01-20")]

Imgur

總結

今天複習了資料的取得,說明了如何運用python的運算子過濾資料,還有用pandas內的函數取得。
那今天就到這啦!第八天就這麼結束了,只有一次,第三十天或第七天其實也是(廢話),那就明天見啦!


上一篇
[Day07]Pandas操作資料的函數!
下一篇
[Day09]Pandas索引的運用!
系列文
使用Python進行資料分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
Denny Chang
iT邦新手 2 級 ‧ 2019-09-27 17:59:22

您好,小弟剛入門python,想請教一下篩選時間的問題
我先新增了min欄位計算出時間差,但卡在不知道如何只保留出點播時間>59秒的資料

song['min']=pd.to_datetime(song['播放結束時間']) - pd.to_datetime(song['播放開始時間'])
filter = (song["min"] > "59") #秒數格式錯誤
song[filter]
https://ithelp.ithome.com.tw/upload/images/20190927/20116986z7Qe2Ah8Dh.png

0
p39212053
iT邦新手 4 級 ‧ 2020-04-29 14:32:34

employees[(mask1 | mask2)] 和 employees[(mask1 & mask2)]
需要改成
employees[(mask1) | (mask2)]

employees[(mask1) & (mask2)]

才能正確執行

0
rex655482
iT邦新手 5 級 ‧ 2020-11-03 15:37:44

您好~小弟看了您的文章覺得受益良多~最近再作練習的時候遇到一些瓶頸,
EX:新增一欄"狀態",而本來的DataFrame有欄位"目前合約狀態","退租原因"
1.如果目前合約狀態 != 欠停、強停、合約終止 →那麼新的一行"狀態" 要顯示"繼續使用"
2.如果新的一行"狀態"為空白 &(且) 退租原因 != 欠拆、強拆、空白 → 那麼"狀態"要顯示 = "不使用"
如果用excel慢慢篩選也可以,但會花費較多時間且容易出錯,想請高手指點迷津,目前想到可以使用迴圈,但大部分的人不建議使用,也上網查了許多文章,但都沒有相關的作法,謝謝~

0
mikeyunlin
iT邦新手 3 級 ‧ 2021-03-12 14:23:52

df.ix['b'] 應改為 df.loc['b']

ix is deprecated in v0.20.0 and replaced by loc, iloc.
https://pandas.pydata.org/pandas-docs/version/1.0/whatsnew/v0.20.0.html

1
arguskao
iT邦新手 4 級 ‧ 2022-09-18 21:56:01

請問如果要篩選地址,地址裡面有"台北市XX路XX號"
要如何篩選只有台北市的資料呢?

我要留言

立即登入留言