开篇
上一篇的数据存成了文件,这一篇的问题是:数据读进来了,可它长什么样、有几行几列、哪列是数字、哪列有空值,我完全不知道。这一篇我整理了一套拿到新数据后的固定"体检动作"。
数据查看的六个方法
还是那份 sales.csv:
df1 = pd.read_csv('data/sales.csv',
usecols=['订单号', '产品类别', '产品名称', '销售数量', '单价'])
看开头结尾:df1.head(10) 看前 10 行,df1.tail(10) 看后 10 行。不传参数默认是 5 行。这是最快确认"列名对不对、数据有没有错位"的办法。
看统计概览:df1.describe() 会输出一张统计表,只针对数字列,给出行数、均值、标准差、最小值、四分位数、最大值。我一般靠它一眼看出异常,比如"单价"列如果 min 是 0 或者 max 大得离谱,就说明数据有问题。
看整体信息:df1.info() 是我认为最有价值的一个,它同时列出列名、每列的非空值数量、数据类型、内存占用。非空数量和总行数一减,就是每列缺了多少数据。
这里有个小坑:info() 本身就是直接打印到屏幕的,如果你写成 print(df1.info()),会先输出正常信息,最后再多冒出一个 None。我在笔记里专门给这行加了注释提醒下次的自己。
看形状和列名:df1.shape 返回 (行数, 列数),df1.columns 返回列名索引。这两个是我在写后续代码前一定会确认的。
数据选择:先选列,再选行
选单列用一个方括号,得到的是 Series:
var1 = df2['产品名称']
选多列要用两个方括号(外面那层是"传一个列表"):
var2 = df2[['产品名称', '单价']]
我一开始写成 df2['产品名称', '单价'] 直接报错。记住规律:单列 → Series,多列 → 还是 DataFrame,方括号套列表的本质是"我给了你一个列名清单"。
选行用 loc 和 iloc。我的笔记里给自己解释过"什么是行号":行号是从 0 开始的整数,第一行是 0,第二行是 1,而且行号不能改;而上一篇用 index= 自定义的 a、b、c 那种是"索引标签"。
var3 = df2.loc[0] # 单行
var4 = df2.loc[0:5] # 多行
选行这块是我目前最容易晕的地方,所以先记两条结论顶用:切片 0:5 包含结尾的 5(这点和 Python 原生列表不一样,原生是取到 4);纯数字行号场景下 loc 和 iloc 表现接近,但 iloc 只认位置、loc 还认标签。