认识 DataFrame
3 道练习题·预计 40 分钟·做对一题解锁下一段
前言
各位童鞋还记得吗?上一章,只用三行 pandas 代码,就回答了「钱都花到哪儿去了」。那三行里,最要紧的其实是第一步:pd.read_csv() 读出来的那张表,也就是 DataFrame。为什么说它最要紧呢?因为后面所有的筛选、统计、分组、画图,都是在这张表上做的。
所以这一章先不急着算,而是先把这张表认清楚:它由哪几部分组成?有多少行、多少列?每一列装的是什么类型的数据?里面有没有奇怪的值?这一步,就是六步里的「探索」。
有的童鞋可能会想:看个表有什么好学的,直接算不就行了?其实,拿到一份新数据,先花几分钟把它看清楚,比一上来就埋头计算要省事得多。很多分析出了错,追查到最后,都是因为一开始没发现:某一列存的是文字,而不是数字;或者某一列有一大半是空的。
学这一章之前,需要先学完 数据分析课第 1 章 。
目录
这一章会学到:
- 一、读进一张表——
read_csv()、head()和tail() - 二、看清表的样子——行数、列名、数据类型和
info() - 三、一列就是一个 Series——取出一列,算一算
- 四、
describe()——一眼看全局 - 五、常见坑
- 六、自己查一次文档——让
describe()也看看文字列 - 七、小结与回看
学完这一章,拿到任何一份 csv,你都能在几分钟内说清楚:它有多少行、有哪些列、每一列是什么样的。
一、读进一张表
要认识一张表,最直接的办法就是把它打印出来看看。先把记账本读进来:
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 行。
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 下面加上这一行,效果是一样的:
pd.set_option('display.unicode.east_asian_width', True)不加也没关系,数据还是一样的,只是汉字比较多的列会有点歪。
二、看清表的样子
上一节是用眼睛看表。可是一千多行的表,光靠眼睛是看不全的。那么,这张表到底有多少行、有哪些列、每一列又是什么类型?这些基本情况,几行代码就能问清楚:
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() :
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 章清洗数据时,第一件事就是看这个数。
整张表的样子看清楚了。下一节,咱们把目光放到其中的一列上。在那之前,先做一道练习:用同样的办法,看看两点书店的书目有多大。
books.csv 是两点书店的书目,爬虫课第 9 章就是把它抓下来的。读进这份文件,先打印它的行数和列数,再把列名变成列表打印出来。
运行后的输出应该是:
(120, 10)
['id', 'title', 'author', 'category', 'price', 'rating', 'reviews', 'stock', 'pages', 'year']推荐一个,全网最全最友好的中文 AI 编程指南: coding.stormzhang.ai