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
数据集中字段的含义如下:
Release Date
:发行日期Season
:第几季Episode
:第几集Episode Title
:每集的标题Name
:出现的人物Sentence
:所说的话请解决以下问题:
(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
nunique()
:显示有多少个唯一值。unique()
:显示所有的唯一值。class IndexOpsMixin:
def nunique(self, dropna: bool = True) -> int:
class Series(base.IndexOpsMixin, generic.NDFrame):
def unique(self):
在本例中通过nunique()
函数可以得到出现人物的个数,unique()
函数可以得到出现人物的列表。
2. count和value_counts
count()
:返回非缺失值元素个数。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!
联系客服