DataFrame 表格的格式

我们首先理解 Pandas 怎么存表格数据的。它有行,有列。一行是一个“记录”(Record)。列的话呢,有两种称呼:计算机领域,一般会说“特征”,比如训练机器学习模型,都是说:提取特征、做特征工程。在数据统计学里面一般都叫变量。比如我们的同学表,每一行是个同学,而“性别”是一列。

Pandas 的每一行和每一列,都有“标签”(Label)。比如说这一行的 Label 是“爱丽丝”,这一列的 Label 是“性别”。列的 Label 也称“表头”。标签特别有用,因为我们取数据子集的时候,就可以拿这个标签去取。

Pandas 里的 Record 数据,是有顺序的。因此,我们调 head() 函数,就会显示最前面几个。因为这些记录有顺序,所以我们后面也可以通过这些位置数字,去取数据子集。

Pandas 有两种数据结构:当表有很多列的时候,是 Dataframe。当表只有一列的时候,是另一种数据结构,叫 Series,它就是一串。

为什么叫 Dataframe 呢?因为 Pandas 是模仿 R 语言的。R 语言是 70 年代起就很流行的一个数据分析的语言,在统计学里用的特别多。在 R 语言里面,表的名字就叫 Frame。 Pandas 借鉴了 R 语言,所以它把自己的表叫做 Dataframe。因为 Pandas 借鉴了 R 语言,所以大家学完了 Panda 以后,再学 R 语言,或者学了 R 语言之后,再学 Pandas,就会觉得它们挺像。

Dataframe 和 Series 的函数有些不一样,这经常给大家带来困扰。大家有时候跑一个函数发现跑不通,再一看原来你现在操作的是个 Series。我们可以通过 to_frame() 函数把 Series 转变成一个只有一列的 Dataframe。

作为例子,我们下面看两个表的数据。

第一个表是每年出生的人的姓名统计。表名叫 Baby Names。这个数据是一个 csv 文件,所以我们用 Pandas 的 read_csv 函数把它读入,然后存到一个 Dataframe 里。

CSV 文件是我们做数据分析时常见的一种数据文件格式。大家平时常用的是 Excel 表。它的扩展名 XLS。我们做大数据的同学经常会打开的文件是 CSV 格式的文件。这个文件其实是一个文本文件,你用 VS code 就可以打开。打开之后,你就会发现它的第一行是一些列名,然后下面每一行是一个数据记录,其中每一个属性用逗号隔开。

读入后,我们能看到这个 Dataframe 有四列,分别是 Name、Sex、Count、Year。因此,它的每一行,是记录了某年的某种性别的某个名字的出生人口总数。比如,2000 年取名字是 Lilibet 的女生一共有几个。

就像我们一直强调的,拿到一个数据后的第一件事情是分析它的数据 Scope 和 Bias。关于 Scope,我们问四个问题:who、why、when、where。我们下面就问这四个问题。谁收集了这个数据呢?社保局。为什么收集呢?因为孩子出生后,要登记,办出生证明。数据何时收集的?2021 年 3 月。在哪里?在美国。关于 Bias。分析后,我们发现,在时间上,这个数据只包括 1879 年之后的数据。然后,1937 年以后,很多人不去社保局登记。然后,如果没有登记出生地的话,这个数据里不统计。这些都是数据的 Bias。对数据 Scope 和 Bias 对分析能够让我们理解数据的背景,评估它是否适合我们要解决的问题。因此,要形成习惯,拿到数据后,先问四个问题,然后再看看它的 Bias。

下面我们来看表格的行和列的 Label。每一列都有一个 Label,所以 sex 就是列的 Label。行的 Label 呢,就是表的“索引”(index)。我们看到,这个 Baby 表的索引是从零开始,逐行向上累加。为什么不拿名字当 index 呢?因为名字可能重复,而 index 不能重复。比如“Mike”这个名字,2020 年可能有 1 千个 Mike,到了 2021 年可能有 2 千个 Mike。所以,它可能会重复的,所以不能用做 index。所以就用这个累加的数字做 Index。

当名字不会重复的时候,我们就推荐用这个名字作为行的 Label。比如这第二个表。它是一个特别有意思的狗的数据。它有四个 feature:glooming,就是“梳毛”,比如每周都要给它梳一次毛,否则它就特别痛苦。还有 Food cost,就是它吃的食物的成本。Kid 呢,就说这种狗是不是适合和小孩玩。Size 就是它是大狗小狗。这个表的行 Label 就是狗的类型,比如你看第二行是德国牧羊犬。为什么这里我们可以用狗的类型作为 Index 呢?因为每种类型只可能出现一行。

注意,表的 Index 不是一列。但 glooming 是列。这个 index 的话,我们怎么去取它呢?用 pd.index 取它。


Index Previous Next