📊 第3章 Pandas 入门
📄 一句话概括

五个属性先记住:shape、columns、index、dtypes、values。前两个最常用。 info() 给三件事:行数、每列的非空计数与类型、占多少内存。 describe() 给数值列八个数。均值、标准差、四分位都在里面。

📝 本章和前面几章的关系

上一篇讲怎么造表,这一篇讲怎么「摸清」一张表。 这一节全是查询,没有计算。但它是后面所有操作的地基——不知道表长什么样,就没法决定下一步。

一、五个属性,先看一眼

属性 返回 本表的值
shape 行列数 10 行 6 列
columns 列名 姓名、班级、语文、数学、英语、总分
index 行标签 0 到 9
dtypes 每列类型 int64 四列,str 两列
values 纯数值数组 10 行 6 列

这五个够用了。attribute 不带括号,method 带括号——df.shape 对,df.shape() 错。 这是新手第一个语法错,而且报错很难懂:'tuple' object is not callable。

二、info:一次看清全貌

info() 给三件事:一共多少行、每列多少个非空值及其类型、整表占多少内存。 非空计数那一列特别有用:它比总行数小,就说明那列有缺失值。 所以拿到任何新数据,先 info 再 head。head 只看值,info 看结构。

内存那一行也值得看:几百兆的表,后面每一步操作都会慢,得先想清楚要哪几列。

三、describe:数值列的八个数

count 非空个数、mean 均值、std 标准差、min 最小、25%/50%/75% 四分位、max 最大。 本表三科的均值分别是 82.70、83.00、81.90——数学最高,英语最低。 标准差最小的是语文 8.99,最大的是数学 10.66。 别凭印象,看数——直觉上总以为数学分得最开,实际是语文最集中。

describe 的分位数是「位置上的值」,不是算出来的平均,和均值是两回事。

四、行列互换:T

df.T 把行列对调:10 行 6 列变成 6 行 10 列。 实际用途不多,但打印宽表时有用——竖着排比横着排容易看清。 T 也是属性不是方法,写 df.T,不写 df.T()。

注意对调之后,原来的列名变成行标签,原来的行标签变成列名。

五、这一节的用法总结

拿到一份新数据,固定顺序打四样:info()、head()、describe()、shape。 三十秒之内能回答:几行几列、有没有缺失、数值范围合不合理、类型对不对。 这四个问题答不上来,后面写什么代码都是瞎猜。

习惯养成之后,看别人的数据也能三十秒进入状态。

六、动手 Demo:DataFrame 的常用属性与函数

造一张成绩表,依次打五个属性、info、describe。 info 的输出被 redirect 到字符串里,再逐行打出来——它默认直接打到终端。

import io
import pandas as pd

DF = pd.DataFrame({
    "姓名": ["张伟", "王芳", "李娜", "刘洋"],
    "班级": ["一班", "一班", "一班", "二班"],
    "语文": [88, 92, 75, 85],
    "数学": [92, 95, 68, 88],
})

print("shape   %s" % (DF.shape,))
print("columns %s" % list(DF.columns))
print("index   %s" % list(DF.index))
print("dtypes"); print(DF.dtypes.to_string())

buf = io.StringIO()
DF.info(buf=buf)
print(buf.getvalue())

print(DF[ ["语文", "数学"]].describe().round(2).to_string())

实跑输出:

--------------------------------------------------------------------
DataFrame 的常用属性与函数
--------------------------------------------------------------------

  ① 五个属性,先看一眼
  --------------------------------------------------------------------

| 属性 | 返回 | 本表的值 |
|---|---|---|
| shape | 行列数 | 10 行 6 列 |
| columns | 列名 | 姓名、班级、语文、数学、英语、总分 |
| index | 行标签 | 0 到 9 |
| dtypes | 每列类型 | int64 四列,str 两列 |
| values | 纯数值数组 | 10 行 6 列 |

  这五个够用了。其中 shape 和 columns 最常用,写脚本时天天打。
  ! attributes 不带括号,方法带括号。df.shape 对,df.shape() 错——这是新手第一个语法错。

  ② info:一次看清全貌
  --------------------------------------------------------------------
    <class 'pandas.DataFrame'>
    RangeIndex: 10 entries, 0 to 9
    Data columns (total 6 columns):
     #   Column  Non-Null Count  Dtype
    ---  ------  --------------  -----
     0   姓名      10 non-null     str
     1   班级      10 non-null     str
     2   语文      10 non-null     int64
     3   数学      10 non-null     int64
     4   英语      10 non-null     int64
     5   总分      10 non-null     int64
    dtypes: int64(4), str(2)
    memory usage: 612.0 bytes
  info 给三件事:行数、每列的非空计数和类型、占多少内存。
  非空计数这一列特别有用——它比总行数小,就说明有缺失值。
  ! info 是拿到任何新数据的第一条命令,比 head 更全面:head 只看值,info 看结构。

  ③ describe:数值列的八个数
  --------------------------------------------------------------------

| 行 | 语文 | 数学 | 英语 |
|---|---:|---:|---:|
| count | 10.0 | 10.0 | 10.0 |
| mean | 82.7 | 83.0 | 81.9 |
| std | 8.99 | 10.66 | 10.14 |
| min | 68.0 | 65.0 | 60.0 |
| 25% | 76.0 | 75.25 | 79.25 |
| 50% | 84.0 | 87.0 | 84.5 |
| 75% | 89.5 | 90.75 | 87.75 |
| max | 95.0 | 95.0 | 95.0 |

  语文均值 82.70,数学 83.00,英语 81.90——数学最高,英语最低。
  标准差最小的是数学(10.66),说明这科分数最集中。
  ! describe 的分位数是按「50% 位置的那个值」算的,不是按平均值算,两者别混。

  ④ 行列互换:T
  --------------------------------------------------------------------
  df.T 把行列对调。原本 10 行 6 列,对调后 6 行 10 列。
  实际用途不多,但打印宽表时有用:竖着排比横着排好看。
  ! T 是属性不是方法,写 df.T,不写 df.T()。

info(buf=...) 是它唯一能把输出接到变量里的办法——不给 buf 就直接打印到终端。 DF.info() 的返回值是 None,所以 df2 = DF.info() 拿到的永远是空。要拿内容只能用 buf。

30 秒实验

  1. 把 info 里的 buf 去掉,直接 DF.info(),看看输出去了哪里。
  2. 给某列塞一个 None,再 info,看非空计数怎么变。
  3. 想一想:为什么 describe 不统计姓名列?如果强行统计会得到什么?

常见误区

  1. 给属性加括号:df.shape() 报 tuple is not callable。
  2. 以为 info() 有返回值:它是打印用的,返回 None。
  3. 只看 describe 不看 info:describe 看不到缺失,info 才看得到。
  4. 不看内存占用:几百兆的表硬读进来,后面的操作全都卡。
自测三问(点开对答案) 1. info 和 describe 各回答什么问题? —— info 回答「表有多大多宽、哪列缺值、什么类型」;describe 回答「数值列分布成什么样」。 2. 为什么 df.shape 不能加括号? —— 因为它是属性不是方法,shape 本身就是一个元组,元组不能当函数调用。 3. 怎么把 info 的输出存下来? —— 传一个 StringIO 给 buf 参数,然后读那个 StringIO 的内容。

表摸清了,接下来该真正读文件。下一篇专讲 read_excel 的四个常用参数。

相关笔记