數據分析工具PANDAS技巧:如何過濾數據

在本文中,咱們將介紹在Python中過濾pandas數據幀的各類方法。 數據過濾是最多見的數據操做操做之一。 它相似於SQL中的WHERE子句,或者必須在MS Excel中使用過濾器根據某些條件選擇特定行。 就速度而言,python執行過濾和聚合更佳。 它有很棒的庫:pandas。 Pandas是在numpy包之上構建的,它是用C語言編寫的,這是一種低級語言。 所以,使用pandas包進行數據操做是處理大型數據集的快速而智能的方法。html

image

數據過濾的示例

它是預測建模或任何報告項目的數據準備的最初步驟之一。 它也被稱爲「子集數據」。 請參閱下面的一些數據過濾示例。python

  • 選擇在2019年1月1日以後開立賬戶的全部活躍客戶
  • 提取過去6個月內進行超過3筆交易的全部客戶的詳細信息
  • 獲取在組織中工做超過3年且在過去兩年中得到最高評級的員工的信息
  • 分析投訴數據並肯定在過去1年內提交超過5個投訴的客戶
  • 提取人均收入超過40K美圓的地鐵城市的詳細信息

導入數據

咱們將使用包含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

  • 方法1:DataFrame方式
>>> 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行。函數

  • 方法2:查詢函數

在pandas包中,有多種方法能夠執行過濾。 上面的代碼也能夠像下面顯示的代碼同樣編寫。 此方法更優雅,更易讀,每次指定列(變量)時都不須要說起數據框名稱。工具

>>> newdf = df.query('origin == "JFK" & carrier == "B6"')
複製代碼
  • 方法3:loc函數

loc是位置術語的縮寫。 全部這三種方法都返回相同的輸出。 這只是一種不一樣的過濾行的方法。測試

>>> newdf = df.loc[(df.origin == "JFK") & (df.carrier == "B6")]
複製代碼

按行和列位置過濾Pandas數據幀

假設您想按位置選擇特定的行(假設從第二行到第五行)。 咱們可使用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
複製代碼

參考資料

按行位置和列名稱過濾pandas數據幀

>>> 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"))]
複製代碼

過濾Pandas Dataframe中的字符串

>>> 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複製代碼

文章來自阿里雲開發者社區

原文連接:developer.aliyun.com/article/715…

相關文章
相關標籤/搜索