55個任務,55種用法幫你搞定資料切片,索引和過濾(建議收藏)
前言
資料分析經常需要從海量的資料集中過濾到自己感興趣的資料。今天我們
透過一個30行的mini資料集,結合55個經典的任務來講解Pandas中的切片,索引和過濾功能
。
本文的正確閱讀方式:
方式1: 下載資料集,復現程式碼
方式2: 放入收藏夾,日後查閱
方式3: 有興趣同學下載資料先自己嘗試,然後對比。
關於資料集和任務
該資料集是從日常分析的多個數據集中提煉出來的。資料集包含和員工管理相關的常用資訊:
ID 員工工號
Name 員工姓名
Birth Date 出生日期
Department 部門
Tel 電話
Salary 薪資
Age 年齡
Gender 性別
Education 學歷
Salary Base 薪資基準
Check in 簽到時間
import pandas as pd
pd。set_option(‘display。max_columns’, 20)
pd。set_option(‘display。max_rows’, 30)
file = ‘filter_dataset。csv’
df = pd。read_csv(file)
df[‘ID’] = df[‘ID’]。astype(‘int64’)
df[‘Tel’] = df[‘Tel’]。astype(‘string’)
df[‘Birth Date’] = pd。to_datetime(df[‘Birth Date’])
df[‘Check in’] = pd。to_datetime(df[‘Check in’])
可以看到資料型別多種多樣,數字型,文字型,類別型,有序類別型,類似於數字的文字(電話),日期型,時間型等。結合資料多樣性,我們針對該資料集制定55個任務。
這55 個任務涵蓋了幾乎所有常用的業務場景。注意每個任務 # 之前為任務目的,# 之後為技術手段。
以下列出部分常見(經典)的任務:
獲得員工的姓名和工資
根據工號查員工資訊
查詢所有姓Ma的員工
查詢重名員工
查找出生在80後員工
查詢薪資高於一定水平的員工
查詢使用聯通號碼的使用者
查詢手機尾號包含4的使用者
查詢HR裡面的男性員工
查詢8點到9點簽到的員工
查詢學位高於本科的員工
查詢薪資高於薪資基準的員工
查詢12月份出生的員工
本文涵蓋的技術包含:
基礎的索引與切片函式,loc,iloc,at,iat,[] 等
不常用的函式:lookup, query,select_dtypes
str方法:isin,startwith,endswith,contains,slice等
dt方法:year,month,DatetimeIndex等
cat方法:Categorical型別
基於標籤/索引查詢資料
1。 查詢姓名資訊,返回一維資料 #基於標籤的選擇單列,返回Series
print(df[‘Name’])
2。 查詢姓名資訊,返回一維資料 #基於標籤的選擇單列,返回Series
print(df。Name)
3。 查詢姓名資訊,返回二維資料 #基於標籤的選擇單列,返回Dataframe
print(df[[‘Name’]])
4。 查詢姓名和工資資訊 # 基於標籤的選擇多列,返回Dataframe
print(df[[‘Name’, ‘Salary’]])
5。 選取所有物件型別資料# 基於資料型別選擇列
print(df。select_dtypes(include=‘object’))
6。 選取所有整型資料# 基於資料型別選擇列
print(df。select_dtypes(include=‘int64’))
7。 選取工號為10001員工資訊 # 基於標籤(索引)選擇單行
df。set_index(‘ID’, inplace=True)
print(df。loc[10001])
8。 選取工號為10001到10003員工資訊 # 基於標籤(索引)選擇連續多行
print(df。loc[10001:10003])
print(df。loc[‘10001’:‘10003’])
9。 選取工號為10001和10003員工資訊 # 基於標籤(索引)選擇指定不連續多行
print(df。loc[[10001, 10003]])
基於位置查詢資料
10。 選取第一行資料 # 基於位置選擇單行
print(df。iloc[0])
11。 選取第一列資料 # 基於位置選擇單列
print(df。iloc[:, 0])
12。 查詢工號為10001和10003員工的姓名和工資 # 基於標籤選擇特定行和列的交叉的元素
print(df。loc[[10001, 10003], [‘Name’, ‘Salary’]])
13。 查詢所有員工的姓名和工資 # 基於標籤選擇所有行和列的交叉的元素)
print(df。loc[:, [‘Name’, ‘Salary’]])
14。 查詢工號為10001員工的姓名 # 基於標籤選擇唯一元素
print(df。loc[10001, ‘Name’])
15。 查詢工號為10001員工的姓名 # 基於標籤選擇唯一配對元素 (等同於loc)
print(df。lookup([10001], [‘Name’]))
16。 查詢工號為10001員工的姓名和10003員工的工資 # 基於標籤選擇多個配對元素
print(df。lookup([10001, 10003, 10003], [
‘Name’, ‘Name’, ‘Salary’]))
17。 查詢第一行和第三行,第一列,第5列對應的資料 # 基於位置選取特定行和列
print(df。iloc[[0, 2], [0, 4]])
18。 查詢第一行和第三行所有資料 # 基於位置選取特定行和所有列
print(df。iloc[[0, 2], :])
19。 查詢第一行第一列對應的資料 # 基於位置選取某一行和某一列對應的元素
print(df。iloc[0, 0])
20。 查詢工號為10001員工的姓名 # 等同於loc獲取單個元素
print(df。at[10001, ‘Name’])
21。 查詢第一行第一列對應的資料 # 等同於iloc獲取單個元素
print(df。iat[0, 0])
基於缺失值查詢
22。 選擇帶有缺失值的行
print(df[df。isnull()。any(axis=1)])
23。 選擇帶有缺失值的列
print(df。loc[:, df。isnull()。any(axis=0)])
基於數值大小的條件查詢
24。 選擇年齡大於40歲的員工 # 基於數值大小的單個條件選擇資料
print(df[df[‘Age’] >= 40])
25。 選擇年齡在35歲和40歲之間的員工 # 基於數值大小的多個條件選擇資料
print(df[(df[‘Age’] >= 35) & (df[‘Age’] <= 40)])
26。 選擇年齡在35歲和40歲之間的員工 # 基於資料範圍選擇資料
print(df[df[‘Age’]。between(35, 40)])
27。 選擇年齡小於30歲的員工# 等同於<
print(df[df[‘Age’]。lt(30)])
28。 選擇年齡等於30歲的員工# 等同於==
print(df[df[‘Age’]。eq(30)])
29。 選擇年齡最大的員工資訊# 基於某列數值最大所在的行
print(df。loc[df[‘Age’]。idxmax()])
30。 選擇年齡最小的員工資訊 # 基於某列數值最小所在的行
print(df。loc[df[‘Age’]。idxmin()])
31。 選擇年齡最大的員工資訊# 等同於idxmax loc 組合
print(df。iloc[df[‘Age’]。argmax()])
32。 選擇年齡最小的員工資訊 # 等同於idxmin loc 組合
print(df。iloc[df[‘Age’]。argmax()])
33。 選擇工資比基準工資高的員工# 基於多列數值的比較結果返回資料
print(df[df[‘Salary’] > df[‘Salary Base’]])
34。 選擇工資比基準工資高的員工# 基於表示式返回結果
print(df。query(‘Salary> `Salary Base`’))
35。 選擇工資比基準工資高的員工# 基於複雜表示式返回結果
print(df。query(‘Salary- `Salary Base` > 0’))
基於字串內容的條件查詢
36。 選擇姓名重複的員工# 基於某列是否為重複項進行選擇
print(df[df[‘Name’]。duplicated(keep=False)])
37。 選擇姓Lu的員工 # 基於某字串列是否結尾包含特定字串
print(df[df[‘Name’]。str。endswith(‘Lu’)])
38。 選擇名字叫Lucy的員工# 基於某字串列是否開始包含特定字串
print(df[df[‘Name’]。str。startswith(‘Lucy’)])
39。 選擇電話號碼開頭為189和187的員工 # 基於某字串列指定位置是否開始包含特定字串
print(df[df[‘Tel’]。str[0:3]。isin([‘189’, ‘187’])])
40。 選擇手機號碼尾號包含4的使用者# 基於某字串列指定位置是否開始包含特定字串
print(df[df[‘Tel’]。str。slice(8, 11)。str。contains(‘4’)])
基於日期時間的條件選擇
41。 選擇1980到1990年出生的員工 # 根據特定年,月範圍進行選擇
print(df[df[‘Birth Date’]。dt。year。between(1980, 1990)])
42。 選擇生日為12月的員工# 選取特定年,月
print(df[df[‘Birth Date’]。dt。month == 12])
43。 選擇每月1號出生的員工# 選取每月的1號
print(df[df[‘Birth Date’]。dt。is_month_start])
44。 選擇1980到1990年出生的員工# 基於時間索引,根據特定年,月範圍進行選擇
df_date = df。set_index(‘Birth Date’)
print(df_date。loc[‘1980’:‘1990’])
45。 選擇1986年出生的員工# 基於時間索引,選取特定年或月
print(df_date。loc[‘1986’])
46。 選擇1986年12月出生的員工# 基於時間索引,選取特定年和月
print(df_date。loc[‘1986-12’])
47。 選擇1986-12-01到1986-12-13出生的員工 # 基於時間索引,選取特定日期範圍
print(df_date。loc[‘1986-12-01’:‘1986-12-13’])
48。 選擇‘08:05’簽到的員工 # 基於時間索引,選取某個時間點
df_time = df。set_index(‘Check in’)
print(df_time。at_time(‘08:05’))
49。 選擇‘08:00’到‘09:00’簽到的員工 # 基於時間索引,選取某個時間段
print(df_time。between_time(‘08:00’, ‘09:00’))
基於類別特徵的條件選擇
50。 選擇IT部門的員工# 基於單個子類別刷選
print(df[df[‘Department’] == ‘IT’])
51。 選擇IT部門的員工# 等同於==
print(df[df[‘Department’]。isin([‘IT’])])
52。 選擇IT和銷售部門的員工# 基於多個子類別刷選
print(df[df[‘Department’]。isin([‘IT’, ‘Sales’])])
53。 選擇HR部門的男性員工# 基於多列,單子類別篩選
print(df。loc[df。isin({‘Department’: [‘HR’], ‘Gender’:[‘M’]})。sum(axis=1) > 1])
54。 選擇HR和銷售部門的男性員工# 基於多列,多子類別篩選
print(df。loc[df[‘Department’]。isin([‘HR’, ‘Sales’])
& df[‘Gender’]。isin([‘M’])])
55。 選擇學位高於本科的員工# 基於有序類的順序選擇
df[‘Education’] = pd。Categorical(
df[‘Education’],
categories=[
‘High School’,
‘Bachelor’,
‘Master’,
‘Doctor’],
ordered=True)
print(df[df[‘Education’] > ‘Bachelor’])
總結
以上就是55個經典任務的實現,難度包含入門和中高級別。這些任務能涵蓋日常中95%以上的索引,過濾工作。
每個任務的實現都是一行程式碼,全部採用pandas自帶的函式,效率很高。