分享

技术图文:基于《权力的游戏》数据集学Pandas

 老马的程序人生 2020-09-17

背景

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!


    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多