背景 joyful-pandas 是Datawhale Github 仓库中非常优秀的开源教程之一,目前有 582 个Forks,1835 个Star。这个假期 Python、Numpy 的组队学习材料已经整理完毕,想着把 Pandas 刷一遍就开始 sklearn 了。
怎么刷 Pandas 呢?我的方法就是用输出来倒逼输入,把 joyful-pandas 中的所有习题做完并用图文的形式展现出来。一是记录自己的学习过程,二是给大家提供一个学习 Pandas 的参考。
习题 现有一份关于美剧《权力的游戏》剧本的数据集存储于Game_of_Thrones_Script.csv
文件中。
import pandas as pd df = pd.read_csv('data/Game_of_Thrones_Script.csv' ) print(df.info())# <class 'pandas.core.frame.DataFrame'> # RangeIndex: 23911 entries, 0 to 23910 # Data columns (total 6 columns): # # Column Non-Null Count Dtype # --- ------ -------------- ----- # 0 Release Date 23911 non-null object # 1 Season 23911 non-null object # 2 Episode 23911 non-null object # 3 Episode Title 23911 non-null object # 4 Name 23911 non-null object # 5 Sentence 23911 non-null object # dtypes: object(6) # memory usage: 1.1+ MB
数据集中字段的含义如下:
请解决以下问题:
(a)在所有的数据中,一共出现了多少人物?
(b)以单元格计数(即简单把一个单元格视作一句),谁说了最多的话?
(c)以单词计数,谁说了最多的单词?(不是单句单词最多,是指每人说过单词的总数最多,为了简便,只以空格为单词分界点,不考虑其他情况)
参考答案:
import pandas as pd df = pd.read_csv('data/Game_of_Thrones_Script.csv' ) print(df['Name' ].nunique()) # 564 print(df['Name' ].value_counts().index[0 ]) # tyrion lannister df_words = df.assign(Words=df['Sentence' ].apply(lambda x: len(x.split()))) a = pd.Series(0 , index=df['Name' ].unique())for name in a.index: a[name] = df_words.loc[lambda x: x['Name' ] == name]['Words' ].sum() b = a.sort_values(ascending=False ) print('Name:{0},Words:{1}' .format(b.index[0 ], b[0 ]))# Name:tyrion lannister,Words:26009
可见,在所有的数据中,一共出现了 564 人。说话最多的是 tyrion lannister ,以单词计数 tyrion lannister 仍然是说单词数最多的,共计 26009 个单词。
知识点 1. unique和nunique
class IndexOpsMixin : def nunique (self, dropna: bool = True) -> int:class Series (base.IndexOpsMixin, generic.NDFrame) : def unique (self) :
在本例中通过nunique()
函数可以得到出现人物的个数,unique()
函数可以得到出现人物的列表。
2. count和value_counts
value_counts()
:返回每个元素有多少个。class IndexOpsMixin : def value_counts ( self, normalize=False, sort=True, ascending=False, bins=None, dropna=True ) :class Series (base.IndexOpsMixin, generic.NDFrame) : def count (self, level=None) :
在本例中通过value_counts()
得到每个人物出现的次数,并由大到小排列。其中index
为人物列表,values
为该人物出现的次数。
3. 利用assign方法来增加列
class DataFrame (NDFrame) : def assign (self, **kwargs) -> "DataFrame":
在本例中增加了统计Sentence
单词个数的新列Words
,通过该列来记录Sentence
中单词的个数。
4. loc 函数式索引
class IndexingMixin : @property def loc (self) -> "_LocIndexer":
在本例中通过loc
函数式索引查找满足Name
等于要查找名称的所有记录。之后对这些记录的Words
求和,就可得到这个人所说的单词总数。
5. 值排序
class Series (base.IndexOpsMixin, generic.NDFrame) : def sort_values ( self, axis=0 , ascending=True, inplace: bool = False, kind: str = "quicksort" , na_position: str = "last" , ignore_index: bool = False, key: ValueKeyFunc = None, ) : class DataFrame (NDFrame) : def sort_values ( self, by, axis=0 , ascending=True, inplace=False, kind="quicksort" , na_position="last" , ignore_index=False, ) :
在本例中通过sort_values()
对每个人所说的单词数由大到小排序,取出第一个即可得到最大的单词数量。
6. 第一章 Pandas基础 的知识导图
总结 通过做练习题来巩固 Pandas 的知识点是熟悉 Pandas 的一种有效方式,以往遇到问题直接就摸索着来用了,这次跟着 joyful-pandas 系统的学习一遍夯实基础。大家一起努力。See You!