Python 环境加载中…

认识 DataFrame

3 道练习题·预计 40 分钟·做对一题解锁下一段

完整通读本章 →

教学 01 / 08· 已读

前言

各位童鞋还记得吗?上一章,只用三行 pandas 代码,就回答了「钱都花到哪儿去了」。那三行里,最要紧的其实是第一步:pd.read_csv() 读出来的那张表,也就是 DataFrame。为什么说它最要紧呢?因为后面所有的筛选、统计、分组、画图,都是在这张表上做的。

所以这一章先不急着算,而是先把这张表认清楚:它由哪几部分组成?有多少行、多少列?每一列装的是什么类型的数据?里面有没有奇怪的值?这一步,就是六步里的「探索」。

有的童鞋可能会想:看个表有什么好学的,直接算不就行了?其实,拿到一份新数据,先花几分钟把它看清楚,比一上来就埋头计算要省事得多。很多分析出了错,追查到最后,都是因为一开始没发现:某一列存的是文字,而不是数字;或者某一列有一大半是空的。

学这一章之前,需要先学完 数据分析课第 1 章 。

目录

这一章会学到:

  • 一、读进一张表——read_csv() 、head() 和 tail()
  • 二、看清表的样子——行数、列名、数据类型和 info()
  • 三、一列就是一个 Series——取出一列,算一算
  • 四、describe() ——一眼看全局
  • 五、常见坑
  • 六、自己查一次文档——让 describe() 也看看文字列
  • 七、小结与回看

学完这一章,拿到任何一份 csv,你都能在几分钟内说清楚:它有多少行、有哪些列、每一列是什么样的。

教学 02 / 08· 已读

一、读进一张表

要认识一张表,最直接的办法就是把它打印出来看看。先把记账本读进来:

Python· 可在网页运行
import pandas as pd

ledger = pd.read_csv('ledger_2026.csv')
print(ledger)

输出的结果:

文本
            date      item category    cost payment
0     2026-01-01      房租     居住  2500.0  银行卡
1     2026-01-01  水电燃气     居住   156.0  支付宝
2     2026-01-01      早饭     餐饮    13.0  支付宝
3     2026-01-01      午饭     餐饮    24.5    微信
4     2026-01-01      晚饭     餐饮    30.0    微信
...          ...       ...      ...     ...     ...
1349  2026-12-31      早饭     餐饮     6.5  支付宝
1350  2026-12-31      午饭     餐饮    27.5    微信
1351  2026-12-31      晚饭     餐饮    58.5    现金
1352  2026-12-31      地铁     交通     4.0    微信
1353  2026-12-31      零食     餐饮     9.5    微信

[1354 rows x 5 columns]

可以看到,一张 DataFrame 由三部分组成:

  • 列名:最上面那一行,date 、item 、category 、cost 、payment 。它们来自 csv 文件的第一行。
  • 行号:最左边那一列,从 0 开始数,pandas 管它叫索引(index)。要注意,它不是文件里的数据,而是 pandas 自己加上去的。
  • 数据:除了列名和行号,中间的部分就是数据。

表中间那一行 ... 又是什么意思呢?因为这张表太长了,pandas 只显示开头 5 行和结尾 5 行,中间的部分就用 ... 省略掉了。最后一行还告诉你,这张表一共有 1354 行、5 列。

其实很多时候,咱们并不需要看整张表,只想看看开头或者结尾。这时候就用 head() 和 tail() :括号里写要看几行,不写的话,默认就是 5 行。

Python· 可在网页运行
import pandas as pd

ledger = pd.read_csv('ledger_2026.csv')
print(ledger.head(3))
print(ledger.tail(2))

输出的结果:

文本
         date      item category    cost payment
0  2026-01-01      房租     居住  2500.0  银行卡
1  2026-01-01  水电燃气     居住   156.0  支付宝
2  2026-01-01      早饭     餐饮    13.0  支付宝
            date  item category  cost payment
1352  2026-12-31  地铁     交通   4.0    微信
1353  2026-12-31  零食     餐饮   9.5    微信

head(3) 打印出开头 3 行,tail(2) 打印出结尾 2 行。所以拿到一份数据,第一件事就是 head() 一下,看看每一列长什么样。

最后还有一个小地方。细心的童鞋可能注意到了,表里的中文能对得这么整齐,其实是因为网页里已经替你打开了 pandas 的一个显示选项。要是在自己电脑上运行,就在 import pandas as pd 下面加上这一行,效果是一样的:

Python· 结合前文阅读
pd.set_option('display.unicode.east_asian_width', True)

不加也没关系,数据还是一样的,只是汉字比较多的列会有点歪。

教学 03 / 08

二、看清表的样子

上一节是用眼睛看表。可是一千多行的表,光靠眼睛是看不全的。那么,这张表到底有多少行、有哪些列、每一列又是什么类型?这些基本情况,几行代码就能问清楚:

Python· 可在网页运行
import pandas as pd

ledger = pd.read_csv('ledger_2026.csv')
print(ledger.shape)
print(len(ledger))
print(list(ledger.columns))
print(ledger.dtypes)

输出的结果:

文本
(1354, 5)
1354
['date', 'item', 'category', 'cost', 'payment']
date         object
item         object
category     object
cost        float64
payment      object
dtype: object

这四个 print() ,各问了一件事:

  • shape 是一个元组,写的是(行数,列数)。
  • len(ledger) 得到的是行数。
  • columns 是所有的列名。用 list() 把它变成普通的列表,打印出来好看一些。
  • dtypes 是每一列的数据类型。

这四样里面,数据类型最要紧。为什么呢?因为一列是什么类型,决定了它能拿来做什么。pandas 读文件的时候,会看看每一列的内容,自己判断它是什么类型。常见的有下面这几种:

类型意思记账本里的
float64小数cost 金额
int64整数这里没有
object一般就是文字日期、名称、类别、付款方式

对照着输出来看:cost 是 float64 ,说明 pandas 认出了它是数字,可以直接拿来加减。日期是 object ,说明 pandas 现在只把它当成文字。要把它当成日期来用,还得转换一下,这个第 5 章会讲。

一项一项地问,要写好几行。有没有办法把这些信息一次看全呢?有,用 info() :

Python· 可在网页运行
import pandas as pd

ledger = pd.read_csv('ledger_2026.csv')
ledger.info()

输出的结果:

文本
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1354 entries, 0 to 1353
Data columns (total 5 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   date      1354 non-null   object 
 1   item      1354 non-null   object 
 2   category  1354 non-null   object 
 3   cost      1354 non-null   float64
 4   payment   1354 non-null   object 
dtypes: float64(1), object(4)
memory usage: 31.8+ KB

先说一个要留意的地方:info() 自己就会打印,不用再在外面套 print() 。

再来看输出里的 Non-Null Count ,它说的是每一列非空的值有几个。这里每一列都是 1354,和总行数一样,说明这份账本没有缺失的数据。要是哪一列只有一千出头,那就说明这一列有空着的地方。第 5 章清洗数据时,第一件事就是看这个数。

整张表的样子看清楚了。下一节,咱们把目光放到其中的一列上。在那之前,先做一道练习:用同样的办法,看看两点书店的书目有多大。

练习 1 / 3两点书店的书目有多大题目有问题?

books.csv 是两点书店的书目,爬虫课第 9 章就是把它抓下来的。读进这份文件,先打印它的行数和列数,再把列名变成列表打印出来。

运行后的输出应该是:

文本
(120, 10)
['id', 'title', 'author', 'category', 'price', 'rating', 'reviews', 'stock', 'pages', 'year']
main.py
可编辑
做对当前题解锁下一段 ·03

推荐一个,全网最全最友好的中文 AI 编程指南: coding.stormzhang.ai

学习目录