您當前的位置:首頁 > 書法

55個任務,55種用法幫你搞定資料切片,索引和過濾(建議收藏)

作者:由 資料如琥珀 發表于 書法時間:2020-09-17

前言

資料分析經常需要從海量的資料集中過濾到自己感興趣的資料。今天我們

透過一個30行的mini資料集,結合55個經典的任務來講解Pandas中的切片,索引和過濾功能

本文的正確閱讀方式:

方式1: 下載資料集,復現程式碼

方式2: 放入收藏夾,日後查閱

方式3: 有興趣同學下載資料先自己嘗試,然後對比。

關於資料集和任務

該資料集是從日常分析的多個數據集中提煉出來的。資料集包含和員工管理相關的常用資訊:

ID 員工工號

Name 員工姓名

Birth Date 出生日期

Department 部門

Tel 電話

Salary 薪資

Age 年齡

Gender 性別

Education 學歷

Salary Base 薪資基準

Check in 簽到時間

55個任務,55種用法幫你搞定資料切片,索引和過濾(建議收藏)

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自帶的函式,效率很高。

標簽: df  print  員工  基於  選擇