在本文中,咱們將介紹在Python中過濾pandas數據幀的各類方法。 數據過濾是最多見的數據操做操做之一。 它相似於SQL中的WHERE子句,或者必須在MS Excel中使用過濾器根據某些條件選擇特定行。 就速度而言,python執行過濾和聚合更佳。 它有很棒的庫:pandas。 Pandas是在numpy包之上構建的,它是用C語言編寫的,這是一種低級語言。 所以,使用pandas包進行數據操做是處理大型數據集的快速而智能的方法。html
它是預測建模或任何報告項目的數據準備的最初步驟之一。 它也被稱爲「子集數據」。 請參閱下面的一些數據過濾示例。python
咱們將使用包含2013年從紐約出發的航班詳情的數據集。該數據集有32735行和16列。下載 itbooks.pipipan.com/fs/18113597…。git
表頭以下:github
['year', 'month', 'day', 'dep_time', 'dep_delay', 'arr_time', 'arr_delay', 'carrier', 'tailnum', 'flight', 'origin', 'dest', 'air_time', 'distance', 'hour', 'minute']複製代碼
導入數據api
import pandas as pd
df = pd.read_csv("nycflights.csv")複製代碼
選擇JetBlue Airways航班詳細信息,其中包含2個字母的運營商代碼B6 ,起源於JFK機場。bash
>>> newdf = df[(df.origin == "JFK") & (df.carrier == "B6")]
>>> newdf.head()
year month day dep_time dep_delay arr_time arr_delay carrier tailnum flight origin dest air_time distance hour minute
7 2013 8 13 1920 85.0 2032 71.0 B6 N284JB 1407 JFK IAD 48.0 228.0 19.0 20.0
10 2013 6 17 940 5.0 1050 -4.0 B6 N351JB 20 JFK ROC 50.0 264.0 9.0 40.0
14 2013 10 21 1217 -4.0 1322 -6.0 B6 N192JB 34 JFK BTV 46.0 266.0 12.0 17.0
23 2013 7 7 2310 105.0 201 127.0 B6 N506JB 97 JFK DEN 223.0 1626.0 23.0 10.0
35 2013 4 12 840 20.0 1240 28.0 B6 N655JB 403 JFK SJU 186.0 1598.0 8.0 40.0
複製代碼
這部分代碼(df.origin == "JFK") & (df.carrier == "B6")返回True / False。 條件匹配時爲真,條件不匹配時爲假。 稍後它在df內傳遞並返回與True對應的全部行。 它返回4166行。函數
在pandas包中,有多種方法能夠執行過濾。 上面的代碼也能夠像下面顯示的代碼同樣編寫。 此方法更優雅,更易讀,每次指定列(變量)時都不須要說起數據框名稱。工具
>>> newdf = df.query('origin == "JFK" & carrier == "B6"')
複製代碼
loc是位置術語的縮寫。 全部這三種方法都返回相同的輸出。 這只是一種不一樣的過濾行的方法。測試
>>> newdf = df.loc[(df.origin == "JFK") & (df.carrier == "B6")]
複製代碼
假設您想按位置選擇特定的行(假設從第二行到第五行)。 咱們可使用df.iloc[ ]函數。
python中的索引從零開始。 df.iloc [0:5,]指第一至第五行(此處不包括終點第6行)。 df.iloc [0:5,]至關於df.iloc [:5,]ui
df.iloc[:5,] #First 5 rows
df.iloc[1:5,] #Second to Fifth row
df.iloc[5,0] #Sixth row and 1st column
df.iloc[1:5,0] #Second to Fifth row, first column
df.iloc[1:5,:5] #Second to Fifth row, first 5 columns
df.iloc[2:7,1:3] #Third to Seventh row, 2nd and 3rd column複製代碼
loc根據索引標籤考慮行。 而iloc根據索引中的位置考慮行,所以它只須要整數。 讓咱們建立一個示例數據進行說明
>>> x
col1
9 1
8 3
7 5
6 7
0 9
1 11
2 13
3 15
4 17
5 19
>>> x.iloc[0:5]
col1
9 1
8 3
7 5
6 7
0 9
>>> x.loc[0:5]
col1
0 9
1 11
2 13
3 15
4 17
5 19
複製代碼
>>> df.loc[df.index[0:5],["origin","dest"]]
origin dest
0 JFK LAX
1 JFK SJU
2 JFK LAX
3 JFK TPA
4 LGA ORF
# - 討論qq羣630011153 144081101複製代碼
>>> newdf = df[df.origin.isin(["JFK", "LGA"])]複製代碼
>>> newdf = df.loc[(df.origin != "JFK") & (df.carrier == "B6")]
>>> pd.unique(newdf.origin)
array(['LGA', 'EWR'], dtype=object)
複製代碼
>>> newdf = df[~((df.origin == "JFK") & (df.carrier == "B6"))]
複製代碼
>>> newdf = df[~((df.origin == "JFK") & (df.carrier == "B6"))]
複製代碼
>>> df = pd.DataFrame({"var1": ["AA_2", "B_1", "C_2", "A_2"]})
>>> df
var1
0 AA_2
1 B_1
2 C_2
3 A_2
>>> df[df['var1'].str[0] == 'A']
var1
0 AA_2
3 A_2
>>> df[df['var1'].str.len()>3]
var1
0 AA_2
>>> df[df['var1'].str.contains('A|B')]
var1
0 AA_2
1 B_1
3 A_2複製代碼
文章來自阿里雲開發者社區