📊 阅读时长:16分钟 | 关键词:Pandas、describe描述统计、sort_values排序、sample采样、info摘要
引言
上一篇文章我们学了 DataFrame 的拼接、合并、删除等操作,相当于"把数据折腾到想要的形状"。形状对了,接下来就该"看懂数据"了——这列数据范围多大?有没有异常值?按某列排序后是什么样?这篇文章用五个常用方法帮你快速摸清数据的"底细"。
一、info() 查看数据摘要
拿到一个陌生的 DataFrame,第一件事就应该是.info()——它用几行输出告诉你数据的骨架结构。
importpandasaspdimportnumpyasnp df=pd.DataFrame(data={'name':['Tom','Bob',np.nan],'age':[18,19,17],'height':[167,177,178]},index=['n1','n2','n3'])print(df)df.info()输出:
name age height n1 Tom 18 167 n2 Bob 19 177 n3 NaN 17 178 <class 'pandas.core.frame.DataFrame'> Index: 3 entries, n1 to n3 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 2 non-null object 1 age 3 non-null int64 2 height 3 non-null int64 dtypes: int64(2), object(1) memory usage: 96.0+ bytes一眼就能看到:有几个缺失值、每列数据类型、内存占用。
# verbose=False 打印简短摘要df.info(verbose=False)# show_counts=False 不显示 Non-Null Countdf.info(show_counts=False)| 参数 | 说明 |
|---|---|
verbose | None打印完整摘要(默认),False打印简短摘要 |
show_counts | None显示非空计数(默认),False不显示 |
二、describe() 描述性统计
如果info()是"骨架",describe()就是"体检报告"——它把每列数值型数据的核心指标一次列出。
df=pd.DataFrame(data={'name':['Tom','Bob','Bob'],'age':[18,19,17],'height':[167,177,178]},index=['n1','n2','n3'])print(df.describe())输出:
age height count 3.00000 3.000000 mean 18.00000 174.000000 std 1.00000 6.082763 min 17.00000 167.000000 25% 17.50000 172.000000 50% 18.00000 177.000000 75% 18.50000 177.500000 max 19.00000 178.000000默认只统计数值列(name被跳过了)。如果想看所有列:
# include='all' 显示所有列(包括字符串列)print(df.describe(include='all'))# include='object' 只看字符串列print(df.describe(include='object'))# 组合使用print(df.describe(include=['number','object']))| 指标 | 含义 |
|---|---|
count | 非缺失值数量 |
mean | 平均值 |
std | 标准差 |
min | 最小值 |
25% | 第 25 百分位数 |
50% | 中位数(第 50 百分位) |
75% | 第 75 百分位数 |
max | 最大值 |
参数详解:
| 参数 | 说明 |
|---|---|
percentiles | 默认[.25, .5, .75],可自定义百分位 |
include | None只统计数值列;'all'所有列;'number'数值列;'object'字符串列 |
exclude | 排除指定类型('number'或'object') |
三、常用统计函数
除了describe()一键全输出,也可以单独调用这些函数:
df=pd.DataFrame(data={'name':['Tom',np.nan,'Linda'],'age':[18,19,17]},index=['n1','n2','n3'])print(df.count())# 每列非缺失值数量print(df.count(axis=1))# 每行非缺失值数量# 构造随机数据d=np.random.normal(size=(7,2))df=pd.DataFrame(data=d)print(df.max())# 每列最大值print(df.max(axis=1))# 每行最大值print(df.min())# 每列最小值print(df.min(axis=1))# 每行最小值print(df.mean())# 每列平均值print(df.mean(axis=1))# 每行平均值print(df.var())# 每列方差print(df.var(axis=1))# 每行方差print(df.std())# 每列标准差print(df.std(axis=1))# 每行标准差速查表:
| 函数 | 作用 | 默认 axis |
|---|---|---|
count() | 非缺失值数量 | 0(按列) |
max() | 最大值 | 0(按列) |
min() | 最小值 | 0(按列) |
mean() | 平均值 | 0(按列) |
var() | 方差 | 0(按列) |
std() | 标准差 | 0(按列) |
💡
axis=0是沿着行方向计算(得到每列的统计值),axis=1是沿着列方向计算(得到每行的统计值)。
四、sample() 随机采样
做数据分析时,常常需要从大数据集中"抽几条看看"。sample()就是干这个的。
df=pd.DataFrame(data={'name':['Tom','Bob','Jack','Linda'],'age':[18,19,17,21],'height':[167,177,178,188]},index=['n1','n2','n3','n4'])print(df)name age height n1 Tom 18 167 n2 Bob 19 177 n3 Jack 17 178 n4 Linda 21 188# 默认 n=1,随机抽 1 行print(df.sample())# 按比例抽取(75% = 3 行)print(df.sample(frac=0.75))# 指定抽取 2 行print(df.sample(n=2))# 有放回采样(可能抽到同一行)print(df.sample(n=2,replace=True))# 横向抽 2 列print(df.sample(n=2,axis=1))# 设置随机种子,结果可复现print(df.sample(n=2,random_state=3))| 参数 | 说明 |
|---|---|
n | 采样数量(默认 1),不能与frac同时用 |
frac | 采样比例(如 0.5 = 50%),不能与n同时用 |
replace | True有放回,可能重复采样 |
random_state | 随机种子,保证结果可复现 |
axis | 0 = 采样行(默认),1 = 采样列 |
五、sort_values() 排序
数据分析中排序是高频操作。sort_values()可以按一列或多列排序。
df=pd.DataFrame({'col1':[4,1,2,np.nan,5,2],'col2':[2,1,9,8,7,6],'col3':[0,1,9,4,2,3],'col4':['a','B','c','D','e',1]})print(df)col1 col2 col3 col4 0 4.0 2 0 a 1 1.0 1 1 B 2 2.0 9 9 c 3 NaN 8 4 D 4 5.0 7 2 e 5 2.0 6 3 1# 按单列排序print(df.sort_values(by='col1'))# 按多列排序(先按 col1,再按 col2)print(df.sort_values(by=['col1','col2']))# 降序排列print(df.sort_values(by='col1',ascending=False))# 多列混合排序(col1 升序,col2 降序)print(df.sort_values(by=['col1','col2'],ascending=[True,False]))# 缺失值排到开头(默认排末尾)print(df.sort_values(by='col1',na_position='first'))# 按行标签排序(axis=1,by 指定行标签)print(df.sort_values(by=5,axis=1))# 原地排序df.sort_values(by='col1',inplace=True)print(df)| 参数 | 说明 |
|---|---|
by | 排序依据的列名或列名列表 |
axis | 0 按行排序,1 按列排序 |
ascending | True升序(默认),False降序;也可传列表 |
inplace | True原地修改 |
na_position | 'last'NaN 排末尾(默认),'first'NaN 排开头 |
小结
这五个方法帮你从"不认识数据"到"把握数据轮廓":
| 方法 | 用途 | 记忆口诀 |
|---|---|---|
info() | 数据结构摘要 | 拿到数据先 info,几行几列心里有数 |
describe() | 数值描述统计 | 一键体检,count/mean/std/min/max 全齐 |
count/max/min/mean... | 单指标统计 | 需要哪个取哪个,axis 控制方向 |
sample() | 随机采样 | 大数据抽几条看看,seed 保可复现 |
sort_values() | 排序 | 按列升序降序,NaN 可放头可放尾 |
下一篇文章,我们将探索 Pandas 真正的"生产力引擎"——groupby()分组聚合和apply()函数应用。这才是数据分析中最强大的武器。
本文是「Python从入门到数据分析」系列的第 16 篇。关注我,不错过后续更新。