pandas每天一題-題目13:文字篩選

pandas每天一題-題目13:文字篩選

這是一個關於 pandas 從基礎到進階的練習題系列,來源於 github 上的 guipsamora/pandas_exercises 。這個專案從基礎到進階,可以檢驗你有多麼瞭解 pandas。

我會挑選一些題目,並且

提供比原題庫更多的解決方法以及更詳盡的解析

計劃每天更新一期,希望各位小夥伴先自行思考,再檢視答案。如果對你有幫助,記得轉發推薦給你的好友!

上期文章:

pandas每天一題-題目12:複雜篩選

後臺回覆"資料",可以下載本題資料集

如下資料:

import pandas as pdimport numpy as npdf = pd。read_csv(‘Euro12。csv’)df

pandas每天一題-題目13:文字篩選

資料描述:

這是 2012 年

歐洲盃資料

每行為一支參賽球隊相關資料。顯然,Team 為隊名,唯一的

前面章節講解過的知識點,本文不再講解!

需求:

找出名字以字母"G"開頭的記錄

找出名字以字母"e"結尾的記錄

只列出指定條件的列(含有 "shot" )

下面是答案了

需求1

找出名字以字母"G"開頭的記錄

只要是文字列的處理,首先想到 str 的一系列方法:

df[‘Team’]。str。startswith(‘G’)

pandas每天一題-題目13:文字篩選

注意這只是得到 bool 列

有了 bool 列,篩選就輕而易舉:

cond = df[‘Team’]。str。startswith(‘G’)df[cond]

pandas每天一題-題目13:文字篩選

需求2

找出名字以字母"e"結尾的記錄

同理,有 startswith 自然有 endswith:

cond = df[‘Team’]。str。endswith(‘e’)df[cond]

需求3

只列出指定條件的列(含有 "shot" )

最常見的做法:

cols = [‘Shots on target’, ‘Shots off target’, ‘% Goals-to-shots’, ‘Total shots (inc。 Blocked)’, ‘Saves-to-shots ratio’]df[cols]

如果我只給出這種手動做法,那就太遜了。

之前的章節我們已經知道了篩選資料的本質,

其實這個需求同樣是篩選資料,只不過是篩選列而已。

因此,

同樣構造出 bool 列就可以。

那麼我們的關鍵資料在哪裡?:

df。columns

輸出:

Index([‘Team’, ‘Goals’, ‘Shots on target’, ‘Shots off target’, ‘Shooting Accuracy’, ‘% Goals-to-shots’, ‘Total shots (inc。 Blocked)’, ‘Hit Woodwork’, ‘Penalty goals’, ‘Penalties not scored’, ‘Headed goals’, ‘Passes’, ‘Passes completed’, ‘Passing Accuracy’, ‘Touches’, ‘Crosses’, ‘Dribbles’, ‘Corners Taken’, ‘Tackles’, ‘Clearances’, ‘Interceptions’, ‘Clearances off line’, ‘Clean Sheets’, ‘Blocks’, ‘Goals conceded’, ‘Saves made’, ‘Saves-to-shots ratio’, ‘Fouls Won’, ‘Fouls Conceded’, ‘Offsides’, ‘Yellow Cards’, ‘Red Cards’, ‘Subs on’, ‘Subs off’, ‘Players Used’], dtype=‘object’)

這是一個 Index 物件。

其實,這個 Index 物件也有大部分 Series 物件的方法。

聰明的你能想到啥?

df。columns。str。startswith(‘G’)

輸出:

array([False, True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, True, False, False, False, False, False, False, False, False, False, False])

類似 bool 列的東西(numpy 陣列)

用它可以篩選列:

cond = df。columns。str。startswith(‘G’)df。loc[:,cond]

這能只列出,列名開頭是字母“G”的列

行2:df。loc[行,列],我們需要篩選列,因此一定要用 loc

到此,需求答案呼之欲出:

cond = df。columns。str。contains(‘shot’,case=False)df。loc[:,cond]

行1:case 引數可以忽略大小寫

pandas每天一題-題目13:文字篩選

但是,這資料都沒有隊名,有啥用呀!

cond = df。columns。str。contains(‘shot’,case=False) | (df。columns==‘Team’)df。loc[:,cond]

行1:符合 “|” 是2個bool列之間做“或”運算,這裡的邏輯很簡單,

"列名叫 Team 或者 是列名包含 shot 的列"

pandas每天一題-題目13:文字篩選

做 “並” 運算,可以使用 “&”

推薦閱讀:

Python如何提取文字中的所有數字,原來這問題這麼難

pandas每天一題-題目6:文字轉數值

懂Excel輕鬆入門Python資料分析包pandas(十九):文字條件統計