在資料分析領域,Pandas 是 Python 生態系統中不可或缺的工具。它提供了強大的資料結構和函式,方便我們進行資料處理、清洗、轉換和分析。本文將聚焦於 Pandas 的資料過濾和篩選功能,介紹如何使用各種技巧精準地提取所需的資料。Pandas 的 DataFrame
物件是資料處理的核心,我們將使用它來示範各種過濾和篩選操作。首先,我們會介紹如何根據單一條件或多個條件篩選資料,例如根據城市名稱或薪資範圍提取員薪水料。接著,我們將深入探討 isin()
方法,這個方法可以高效地判斷某個欄位的值是否存在於一個預先定義的集合中,例如篩選出特定城市列表中的員工。此外,我們還會介紹 between()
方法,它可以方便地查詢某個數值欄位的值是否落在一個指定範圍內,例如找出薪資落在特定區間的員工。最後,我們將結合這些技巧,示範如何進行更複雜的多條件組合查詢,例如根據城市和薪資範圍篩選員薪水料。
資料過濾與分析
在進行資料分析時,常常需要根據特定的條件來過濾資料。以下是一個示例,展示如何根據城市名稱來過濾員薪水料。
###原始資料
Employee Name | Salary | City |
---|---|---|
Saurabh | 200000.0 | Hyderabad |
Divya | 140000.0 | Durg |
Saurabh | 150000.0 | Raipur |
Ankit | 110000.0 | Durg |
過濾條件
假設我們想要找出來自特定城市(例如 Durg)的員薪水料。過濾條件可以根據城市名稱來設定。
過濾結果
根據過濾條件,以下是來自 Durg 城市的員薪水料:
Employee Name | Salary | City |
---|---|---|
Divya | 140000.0 | Durg |
Ankit | 110000.0 | Durg |
程式碼實作
import pandas as pd
# 建立原始資料
data = {
"Employee Name": ["Saurabh", "Divya", "Saurabh", "Ankit"],
"Salary": [200000.0, 140000.0, 150000.0, 110000.0],
"City": ["Hyderabad", "Durg", "Raipur", "Durg"]
}
df = pd.DataFrame(data)
# 過濾條件:城市為 Durg
filtered_df = df[df["City"] == "Durg"]
print(filtered_df)
內容解密:
- 資料建立:首先,我們建立了一個包含員工姓名、薪水和城市的 DataFrame。
- 過濾條件設定:然後,我們設定了過濾條件,根據城市名稱(“Durg”)來過濾資料。
- 過濾結果:最後,我們使用
df["City"] == "Durg"
來過濾原始資料,並將結果儲存在filtered_df
中。
圖表視覺化
flowchart TD A[原始資料] --> B[設定過濾條件] B --> C[過濾資料] C --> D[顯示結果]
圖表翻譯:
此圖表展示了資料過濾的流程。首先,我們有原始資料(A)。然後,我們設定過濾條件(B),根據城市名稱來過濾資料。接下來,我們執行過濾操作(C),並將結果儲存在 filtered_df
中。最後,我們顯示過濾結果(D)。
使用 Pandas 進行資料篩選
在資料分析中,篩選特定條件的資料是一項常見的任務。Pandas 提供了多種方法來實作這一功能,包括使用 isin()
方法。
isin() 方法介紹
isin()
方法用於檢查資料框(DataFrame)或系列(Series)中的每個元素是否存在於指定的值列表中。它傳回一個布林值系列,指示每個元素是否存在於列表中。
範例:使用 isin() 方法篩選城市
假設我們有一個包含員薪水料的 DataFrame,現在我們想要篩選出來自特定城市(例如 Hyderabad、Durg、Lara)的員薪水料。以下是如何使用 isin()
方法實作這一功能:
import pandas as pd
# 載入資料
mydf = pd.read_csv('filter_eg.csv').dropna()
# 篩選城市
filtered_df = mydf[mydf['City'].isin(['Hyderabad', 'Durg', 'Lara'])]
# 輸出篩選結果
print(filtered_df)
程式碼解釋
- 首先,我們載入必要的函式庫(pandas),並將其別名為
pd
。 - 我們使用
read_csv()
方法從檔案filter_eg.csv
載入資料,並使用dropna()
方法移除任何含有缺失值的列。 - 接下來,我們使用
isin()
方法篩選出來自 Hyderabad、Durg、Lara 城市的員薪水料。isin()
方法檢查 ‘City’ 列中的每個值是否存在於['Hyderabad', 'Durg', 'Lara']
列表中。 - 最後,我們輸出篩選結果。
內容解密
在這段程式碼中,我們使用 isin()
方法來篩選資料。這個方法傳回一個布林值系列,指示每個元素是否存在於指定的值列表中。然後,我們使用這個布林值系列來篩選原始的 DataFrame,從而得到來自特定城市的員薪水料。
圖表翻譯
以下是使用 Mermaid 圖表語法描述的篩選過程:
flowchart TD A[載入資料] --> B[移除缺失值] B --> C[篩選城市] C --> D[輸出篩選結果]
圖表翻譯
這個圖表描述了篩選過程的步驟。首先,我們載入資料(A),然後移除任何含有缺失值的列(B)。接下來,我們使用 isin()
方法篩選出來自特定城市的員薪水料(C)。最後,我們輸出篩選結果(D)。
使用Pandas進行資料篩選
在這個範例中,我們將使用Pandas函式庫來讀取兩個CSV檔案:filter_eg.csv
和AQI_eg.csv
。我們的目的是根據AQI_eg.csv
中的空氣品質指數(AQI)限制,選擇居住在AQI大於105的城市的員工姓名。
讀取資料
首先,我們需要讀取兩個CSV檔案。假設filter_eg.csv
包含員薪水料,包括姓名、薪水和城市,而AQI_eg.csv
包含城市的AQI資料。
import pandas as pd
# 讀取員薪水料
emp_df = pd.read_csv('filter_eg.csv').dropna()
# 讀取AQI資料
aqi_df = pd.read_csv('AQI_eg.csv')
顯示原始資料
為了確認資料正確性,我們可以先顯示兩個DataFrame。
print(emp_df)
print('-'*50)
print(aqi_df)
print('-'*50)
篩選AQI大於105的城市
接下來,我們需要篩選出AQI大於105的城市。這可以透過以下程式碼實作:
# 篩選AQI大於105的城市
aqi_filter = aqi_df['AQI'] > 105
# 顯示篩選結果
print(aqi_df[aqi_filter])
print('-'*50)
合併篩選結果與員薪水料
最後,我們需要根據篩選出的城市,選擇出居住在這些城市的員工姓名。假設emp_df
中的城市欄位名為City
,而aqi_df
中的城市欄位名為City
,我們可以使用以下程式碼實作:
# 篩選出AQI大於105的城市名稱
aqi_cities = aqi_df.loc[aqi_filter, 'City']
# 選擇出居住在這些城市的員工姓名
result = emp_df[emp_df['City'].isin(aqi_cities)]
# 顯示結果
print(result)
圖表翻譯:
此圖示為合並篩選結果與員薪水料的流程圖。
flowchart TD A[讀取員薪水料] --> B[讀取AQI資料] B --> C[篩選AQI大於105的城市] C --> D[合併篩選結果與員薪水料] D --> E[顯示結果]
內容解密:
上述程式碼實作了根據AQI限制篩選員工姓名的功能。首先,讀取兩個CSV檔案,然後篩選出AQI大於105的城市,最後根據這些城市選擇出居住在這些城市的員工姓名。這個範例展示了Pandas函式庫在資料篩選和合併方面的強大功能。
選擇居住在空氣品質指數(AQI)大於105的城市的員工
在這個例子中,我們將展示如何篩選出居住在空氣品質指數(AQI)大於105的城市的員工。首先,我們需要根據AQI值篩選出城市名稱。
# 篩選AQI大於105的城市
myaqicity = mydf2[myaqi]['City']
print(myaqicity)
接下來,我們使用isin()
方法來篩選出居住在這些城市的員工。
# 篩選居住在AQI大於105的城市的員工
myemp = mydf['City'].isin(myaqicity)
print(myemp)
最後,我們可以使用這個篩選條件來取得居住在這些城市的員工的姓名。
# 取得居住在AQI大於105的城市的員工姓名
print(mydf[myemp]['Employee Name'])
內容解密:
- AQI篩選:首先,我們根據AQI值篩選出城市名稱,儲存在
myaqicity
變數中。 - 員工篩選:然後,我們使用
isin()
方法來篩選出居住在這些城市的員工,儲存在myemp
變數中。 - 姓名取得:最後,我們使用這個篩選條件來取得居住在這些城市的員工的姓名。
圖表翻譯:
flowchart TD A[開始] --> B[篩選AQI大於105的城市] B --> C[篩選居住在這些城市的員工] C --> D[取得員工姓名] D --> E[輸出結果]
圖表翻譯:
- 開始:程式開始。
- 篩選AQI大於105的城市:根據AQI值篩選出城市名稱。
- 篩選居住在這些城市的員工:使用
isin()
方法篩選出居住在這些城市的員工。 - 取得員工姓名:使用篩選條件來取得居住在這些城市的員工的姓名。
- 輸出結果:輸出最終結果。
城市空氣品質指標(AQI)分析
資料來源與處理
原始資料提供了多個城市的空氣品質指標(AQI)資料。為了進行分析,我們首先需要處理這些資料。給定的資料包括城市名稱和對應的AQI值。
資料過濾與選擇
根據提供的資料,我們可以看到有兩組AQI資料。第一組包括Bhopal、Hyderabad、Durg、Raipur和Lara等城市的AQI值。第二組則是從第一組中選擇出Hyderabad、Raipur和Lara這三個城市的AQI值。
城市AQI比較
透過比較,可以發現Hyderabad的AQI值最高,達到150,而Raipur和Lara的AQI值分別為120和110。這些資料可能反映了不同城市空氣品質的差異。
AQI值意義
AQI值是衡量空氣品質的一種指標,越高的AQI值通常表示空氣品質越差。因此,Hyderabad的空氣品質可能是這三個城市中最差的,而Durg的AQI值為90,可能是這些城市中空氣品質最好的。
內容解密:
import pandas as pd
# 建立一個DataFrame來儲存城市AQI資料
data = {
'City': ['Bhopal', 'Hyderabad', 'Durg', 'Raipur', 'Lara'],
'AQI': [100, 150, 90, 120, 110]
}
df = pd.DataFrame(data)
# 選擇特定城市的AQI資料
selected_cities = ['Hyderabad', 'Raipur', 'Lara']
selected_df = df[df['City'].isin(selected_cities)]
# 顯示選擇的城市AQI資料
print(selected_df)
圖表翻譯:
flowchart TD A[資料來源] --> B[資料過濾] B --> C[選擇城市] C --> D[計算AQI值] D --> E[比較AQI值] E --> F[得出結論]
這個流程圖描述了從資料來源到得出結論的整個過程,包括資料過濾、選擇城市、計算AQI值、比較AQI值等步驟。
範圍查詢:使用between()方法
在資料分析中,經常需要根據特定條件篩選資料。其中,查詢某個欄位的值是否落在一個指定範圍內是一種常見的需求。Python的pandas函式庫提供了between()
方法來實作這種功能。
範圍查詢的基本語法
between()
方法的基本語法如下:
df['欄位名稱'].between(left, right, inclusive='both')
其中,left
和right
分別代表範圍的下限和上限,而inclusive
引數則用於指定是否包含下限和上限。其可取值為:
'both'
:包含下限和上限(預設值)'neither'
:不包含下限和上限'left'
:包含下限,但不包含上限'right'
:包含上限,但不包含下限
範圍查詢的實際應用
以下範例展示瞭如何使用between()
方法查詢員工薪水在特定範圍內的資料:
import pandas as pd
# 載入資料
df = pd.read_csv('filter_eg.csv').dropna()
# 查詢薪水在100000至160000之間的員薪水料
print(df[df['Salary'].between(100000, 160000)])
# 查詢薪水在100000至150000之間的員薪水料(含下限,不含上限)
print(df[df['Salary'].between(100000, 150000, inclusive='left')])
不使用between()方法的範圍查詢
如果不使用between()
方法,可以透過組合條件來實作範圍查詢:
# 查詢薪水在100000至160000之間的員薪水料
mycond1 = df['Salary'] >= 100000
mycond2 = df['Salary'] <= 160000
print(df[mycond1 & mycond2])
這種方法雖然可以實作範圍查詢,但相比之下,使用between()
方法更為簡潔和直觀。
內容解密:
在上述範例中,我們使用了between()
方法來查詢員工薪水在特定範圍內的資料。這種方法不僅簡潔,而且可以根據需要自定義是否包含下限和上限。透過這種方式,可以更有效地篩選出符合條件的資料,並進一步進行分析和處理。
圖表翻譯:
flowchart TD A[載入資料] --> B[篩選資料] B --> C{使用between()方法} C -->|是| D[查詢範圍] C -->|否| E[組合條件] D --> F[輸出結果] E --> F
這個流程圖展示了使用between()
方法和不使用between()
方法兩種不同的篩選資料的方式。無論哪種方式,都可以根據需要查詢出符合條件的資料。
範圍查詢:使用 between 方法
在進行資料查詢時,經常需要根據特定條件篩選資料。其中,使用 between
方法可以方便地查詢出符合某個範圍的資料。以下將介紹如何使用 between
方法進行範圍查詢,並探討其引數設定對查詢結果的影響。
範圍查詢的基本使用
假設我們有一個 DataFrame mydf
,其中包含員工的姓名、薪水和城市等資訊。現在,我們想要查詢出薪水在 100000 到 150000 之間的員薪水料。
print(mydf[mydf['Salary'].between(100000, 150000, inclusive='both')])
這裡,inclusive='both'
的設定表示 100000 和 150000 都包含在查詢範圍內。
不同的 inclusive 設定
between
方法的 inclusive
引數可以設定為 'left'
、'right'
或 'neither'
,分別代表著左邊界、右邊界或兩者都不包含在查詢範圍內。
左邊界包含(inclusive=‘left’):此設定下,左邊界(100000)被包含在查詢範圍內,但右邊界(150000)不被包含。
print(mydf[mydf[‘Salary’].between(100000, 150000, inclusive=‘left’)])
- **右邊界包含(inclusive='right')**:此設定下,右邊界(150000)被包含在查詢範圍內,但左邊界(100000)不被包含。
```python
print(mydf[mydf['Salary'].between(100000, 150000, inclusive='right')])
兩者都不包含(inclusive=‘neither’):此設定下,兩個邊界(100000 和 150000)都不被包含在查詢範圍內。
print(mydf[mydf[‘Salary’].between(100000, 150000, inclusive=‘neither’)])
### 結果分析
根據以上設定,查詢結果會有所不同。當 `inclusive='both'` 時,查詢結果會包含所有薪水在 100000 到 150000 之間的員薪水料,包括兩個邊界。當 `inclusive='left'` 時,只有左邊界(100000)被包含在內。當 `inclusive='right'` 時,只有右邊界(150000)被包含在內。最後,當 `inclusive='neither'` 時,兩個邊界都不被包含在查詢結果中。
### 圖表解釋
以下是使用 Mermaid 圖表來視覺化這些查詢過程:
```mermaid
graph LR
A[資料集] -->|between(100000, 150000, inclusive='both')|> B[包含兩邊界]
A -->|between(100000, 150000, inclusive='left')|> C[只包含左邊界]
A -->|between(100000, 150000, inclusive='right')|> D[只包含右邊界]
A -->|between(100000, 150000, inclusive='neither')|> E[不包含兩邊界]
圖表翻譯
這個 Mermaid 圖表展示瞭如何使用 between
方法根據不同的 inclusive
設定來查詢資料集。從圖表中可以看出,不同的設定會導致不同的查詢結果,幫助使用者更好地理解 between
方法的使用方式。
從使用者經驗視角來看,Pandas 的 between()
方法為資料篩選提供了簡潔易用的解決方案。分析其核心功能可以發現,between()
方法巧妙地整合了比較運算,並透過 inclusive
引數提供了更精細的邊界控制,有效提升了資料處理效率。與傳統的組合條件篩選方式相比,between()
方法更具可讀性,降低了程式碼的複雜度,尤其在處理大量資料時,其優勢更加明顯。然而,需要注意的是,between()
方法目前主要應用於數值型資料和日期時間型資料,對於字串型別的範圍查詢,仍需探索其他解決方案。展望未來,Pandas 函式庫可能進一步擴充套件 between()
方法的適用範圍,例如支援字串的模糊匹配或正規表示式匹配,以滿足更多元的資料篩選需求。對於追求程式碼簡潔性和可維護性的開發者而言,優先熟悉並應用 between()
方法進行範圍查詢將是提升程式碼品質的有效途徑。玄貓認為,between()
方法的簡潔語法和靈活的邊界控制,使其成為資料科學家和分析師的必備工具。