这是一个关于 pandas 从基础到进阶的练习题系列,来源于 github 上的 guipsamora/pandas_exercises 。这个项目从基础到进阶,可以检验你有多么了解 pandas。
我会挑选一些题目,并且提供比原题库更多的解决方法以及更详尽的解析。
计划每天更新一期,希望各位小伙伴先自行思考,再查看答案。如果对你有帮助,记得转发推荐给你的好友!
上期文章:pandas每天一题-题目12:复杂筛选
后台回复"数据",可以下载本题数据集
如下数据:
import pandas as pd
import numpy as np
df = pd.read_csv('Euro12.csv')
df
数据描述:
前面章节讲解过的知识点,本文不再讲解!
需求:
下面是答案了
找出名字以字母"G"开头的记录
只要是文本列的处理,首先想到 str 的一系列方法:
df['Team'].str.startswith('G')
有了 bool 列,筛选就轻而易举:
cond = df['Team'].str.startswith('G')
df[cond]
找出名字以字母"e"结尾的记录
同理,有 startswith 自然有 endswith:
cond = df['Team'].str.endswith('e')
df[cond]
只列出指定条件的列(含有 "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]
到此,需求答案呼之欲出:
cond = df.columns.str.contains('shot',case=False)
df.loc[:,cond]
但是,这数据都没有队名,有啥用呀!
cond = df.columns.str.contains('shot',case=False) | (df.columns=='Team')
df.loc[:,cond]
做 "并" 运算,可以使用 "&"
推荐阅读: