ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Pandas DataFrame 常用方法全汇总(入门实操博文)

Pandas DataFrame 常用方法全汇总(入门实操博文) 前言使用 pandas 做数据分析除了 DataFrame 基础创建、索引取值绝大多数工作都依赖各类内置方法查看头尾、列筛选、布尔过滤、统计计算、去重、排序、随机抽样等。本篇基于完整可运行代码分门别类讲解高频方法适配数据分析日常使用。提前固定演示数据集全文所有案例基于这份表格运行import pandas as pd df pd.DataFrame({ name:[tom,tom,jack,alice,bob,allen], age:[15,15,15,20,26,30], score:[60.5,60.5,80,30.6,70,83.5] }, index[a,b,c,d,e,f], # 自定义行标签 columns[name,score,age]) # 自定义列顺序一、查看数据头尾head () /tail ()只看局部行不用打印全表适合快速预览数据。df.head(n)查看前 n 行不传参默认展示前 5 行df.tail(n)查看最后 n 行不传参默认展示最后 5 行# 查看前3行 print(head前3行\n,df.head(3)) # 查看后3行 print(tail后3行\n,df.tail(3)) 默认5行 print(默认前5行,df.head()) print(默认后5行,df.tail())小技巧可以链式搭配列筛选先选列再取头尾精简数据df[[name,score]].head(3)只看姓名、分数的前三行二、单列 / 多列获取搭配头尾使用1. 单列 3 种写法区别表格写法返回类型特点df[name]Series 一维常用适合单独计算df.nameSeries 一维列名无空格 / 特殊字符才能用df[[name]]DataFrame 二维保留表格格式推荐作图、多列统一写法2. 多列获取多列必须用列表包裹列名df[[列1,列2]]# 取name、score两列 print(df[[name,score]]) # 两列前3行 print(df[[name,score]].head(3)) # 单列age最后3行 print(df[[age]].tail(3))三、布尔索引按条件筛选行最核心筛选语法df[条件表达式]支持单条件、多条件组合。布尔索引是 pandas 中最常用、最核心的筛选方式本质是传入一个与 DataFrame 行数相同的布尔序列True对应的行会被保留。它把「判断条件」和「取行」合二为一写起来直观也是后续复杂筛选的基础。规则多条件必须用小括号包裹每个条件且或|不能用 and/or两种写法等价df.score和df[score]取反用~表示「不满足某条件」# 单条件分数大于70 print(df[df.score70]) print(df[df[score]70]) # 多条件分数大于70 并且 年龄小于30 res df[(df[score]70) (df[age] 30)] print(res) # 或条件分数大于70 或者 年龄小于20 res2 df[(df[score]70) | (df[age] 20)] print(res2) # 取反分数不大于70 print(df[~(df[score]70)])query 筛选用字符串写条件除了直接写布尔表达式pandas 还提供了df.query()方法把筛选条件写成字符串代码更简洁、可读性更高尤其适合条件较多或需要动态拼接的场景。相比布尔索引query 省去了重复写df[列名]的繁琐条件一眼就能看懂。# 单条件分数大于70 print(df.query(score 70)) # 多条件分数大于70 并且 年龄小于30 print(df.query(score 70 and age 30)) # 或条件分数大于70 或者 年龄小于20 print(df.query(score 70 or age 20)) # 取反分数不大于70 print(df.query(not (score 70))) # 字符串匹配名字为 tom print(df.query(name tom))query 补充说明query 里可以直接用and/or/not不用像布尔索引那样写/|/~也不用给小括号加额外转义。列名可以直接写在字符串里无需加df[列名]前缀如果列名含空格或特殊字符用反引号包裹例如df.query(my col 10)。query 同样返回新 DataFrame不会修改原表。需要引用外部变量时在变量名前加df.query(score threshold)。补充说明布尔索引返回的是新 DataFrame不会修改原表如需保留结果赋值给新变量即可。条件表达式逐行判断返回的布尔序列长度必须与行数一致否则会报错。多条件组合时和|的优先级高于比较运算符所以每个条件都必须用小括号包裹否则会报语法错误。除了数值比较布尔索引也支持字符串匹配例如筛选名字为 tom 的行df[df[name]tom]。布尔索引与 query 可以按场景灵活选择条件简单、追求直观用布尔索引条件多、想写得更紧凑用 query。四、匹配判断、空值判断isin () /isna ()1. isin () 判断单元格是否包含指定内容用来筛选字段在某个名单里支持多字段匹配# 匹配 23.53 或者23.67 df[df.high.isin([23.53,23.67])]2. isna () 判断空值标记表格里所有缺失值 NaN为空返回 True非空 Falseprint(df.isna())配套补充notna()判断非空。五、数值统计函数单列聚合计算针对数值列score、age做统计全部是列纵向计算。表格方法作用示例sum()求和总分max()最大值最高分min()最小值最低分mean()平均值平均分median()中位数中间分不受极端值影响std()标准差数据波动大小var()方差离散程度quantile(0.25)四分位数25% 分位数print(分数求和,df[score].sum()) print(最高分,df[score].max()) print(最低分,df[score].min()) print(平均分,df.score.mean()) print(中位数,df.score.median()) print(标准差,df.score.std()) print(方差,df.score.var()) print(25%分位数,df.score.quantile(0.25))一键全量统计 describe ()无需逐个调用一次性输出计数、均值、最值、四分位数数据分析必用print(df.describe())describe() 默认只统计数值列返回结果是一个新的 DataFrame每一行对应一个统计指标每一列对应一个数值字段。以本文的 df 为例输出会包含以下指标指标行含义对应 df 中的值score 列count非空值数量6mean平均值约 64.1std标准差约 19.4min最小值30.625%下四分位数约 60.550%中位数约 65.2575%上四分位数约 72.5max最大值83.5补充说明如果只想看某一列的统计结果可以传入列名df[[score]].describe()返回结果仍是 DataFrame便于后续读取。describe() 默认忽略缺失值count 统计的是非空数量不会把 NaN 计入。若数据集中包含非数值列describe() 默认不统计它们如需一并查看可加参数includeall此时会额外输出 unique、top、freq 等类别统计信息。describe() 返回的是 DataFrame可以直接用.loc[mean]或.loc[25%]单独取出某一行指标方便后续计算。info () 查看数据基本信息与 describe() 侧重数值统计不同info()用于快速查看表格的整体结构有多少行、多少列、每列的数据类型、非空值数量以及内存占用是拿到数据后第一步了解数据的常用方法。print(df.info())以本文的 df 为例输出大致如下class pandas.core.frame.DataFrame Index: 6 entries, a to f Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 name 6 non-null object 1 score 6 non-null float64 2 age 6 non-null int64 dtypes: float64(1), int64(1), object(1) memory usage: 192.0 bytes补充说明info()会显示每列的非空值数量如果某列存在缺失值Non-Null Count 会小于总行数方便快速定位数据缺失情况。Dtype 列展示每列的数据类型object通常表示字符串列int64表示整数列float64表示浮点数列。与 describe() 不同info() 不计算任何统计指标只展示结构信息两者搭配使用效果最佳先用 info() 了解整体结构再用 describe() 查看数值分布。六、计数统计count () /value_counts ()df.count()统计每一列非空有效单元格数量df[列名].value_counts()统计一列中每个值出现的频次统计重复次数神器# 各列有效数据行数 print(每一列非缺失值个数\n,df.count()) # 全表行重复频次 print(全表重复频次\n,df.value_counts()) # 常用统计每个年龄出现多少次 print(df[age].value_counts())七、重复值处理duplicated () /drop_duplicates ()duplicated()标记重复行重复返回 True默认整行完全一致才算重复可指定列判断重复drop_duplicates()直接删除重复行返回去重后的新表格# 判断整行是否重复 print(是否整行重复\n,df.duplicated()) # 只根据age列判断重复年龄相同即判定重复 print(age列重复判断\n,df.duplicated(subsetage)) # 删除所有重复行 print(去重后数据\n,df.drop_duplicates())八、随机抽样 sample ()从表格随机抽取若干行做数据随机采样支持抽 1 行、多行。# 默认随机抽1行 print(随机抽1行\n,df.sample()) # 随机抽3行 print(随机抽3行\n,df.sample(3))九、数据排序sort_index /sort_values/nlargest/reset_index1. sort_index按照行索引标签排序ascendingFalse 倒序True 正序# 行索引a~f倒序排列 print(索引降序\n,df.sort_index(ascendingFalse))2. sort_values按列的值排序最常用支持多列联合排序可以给不同列设置不同升降序规则# 先按score升序分数相同则age降序 df_sorted df.sort_values(by[score,age],ascending[True,False]) print(多列混合排序\n,df_sorted)3. nlargest /nsmallest快速取最值前 N 行不用排序再 head一步拿到分数最高 2 条# 取score、age综合最大的2行 print(df.nlargest(2,columns[score,age])) # 配套nsmallest取最小N行 df.nsmallest(2,columnsscore)4. reset_index重置行索引排序或筛选后行索引会变得杂乱用reset_index()可以把索引重置为从 0 开始的连续整数方便后续处理。# 排序后重置索引 df_sorted df.sort_values(byscore, ascendingFalse) print(重置索引前\n, df_sorted) print(重置索引后\n, df_sorted.reset_index()) # dropTrue 丢弃原索引列不保留为普通列 print(丢弃原索引\n, df_sorted.reset_index(dropTrue))5. drop删除行或列drop()用于删除指定行或列默认按行索引删除加参数axis1或columns可删除列。关于axis与columns的关系记住一条规则即可不指定 columns 时axis0 表示行axis1 表示列如果指定了 columns则 axis 参数失效直接按列名删除。# 删除行索引为 a 的行 print(删除a行\n,df.drop(a)) # 删除多行a、b print(删除a、b行\n,df.drop([a,b])) # 删除列用 axis1 或 columns 指定 print(删除score列\n,df.drop(score,axis1)) print(删除age列\n,df.drop(columnsage)) # 删除多列传入列名列表即可 print(删除score、age两列\n,df.drop([score,age],axis1)) print(删除多列columns写法\n,df.drop(columns[score,age])) # 默认不修改原表inplaceTrue 才原地修改 df2 df.drop(a) print(原表未变\n,df.head(2))十、完整配套练习代码import pandas as pd df pd.DataFrame({ name:[tom,tom,jack,alice,bob,allen], age:[15,15,15,20,26,30], score:[60.5,60.5,80,30.6,70,83.5] }, index[a,b,c,d,e,f], columns[name,score,age]) 头尾查看 print(head前3行\n,df.head(3)) print(tail后3行\n,df.tail(3)) 列选取 print(\n单列三种写法) print(df[name]) print(df.name) print(df[[name]]) print(\n多列头尾,df[[name,score]].head(3)) 布尔筛选 print(\n分数大于70,df[df.score70]) print(\n分数70且年龄30,df[(df.score70)(df.age30)]) 匹配、空值 print(\nisin匹配jack,df.isin([jack])) print(\n空值判断,df.isna()) 统计指标 print(\n总分,df[score].sum()) print(平均分,df.score.mean()) print(df.describe()) 计数与去重 print(\n有效行数,df.count()) print(\n重复判断,df.duplicated()) print(\n去重,df.drop_duplicates()) 抽样 print(\n随机抽样,df.sample(2)) 排序 print(\n索引倒序,df.sort_index(ascendingFalse)) print(\n多列排序,df.sort_values(by[score],ascendingTrue)) print(\n分数最高2行,df.nlargest(2,score))十一、新手使用总结预览数据head/tail选列用[]多列必须套列表精准筛选优先用布尔索引多条件记住括号 /|做统计单列用 sum/mean 等全表一键用describe重复清理duplicated查重复drop_duplicates删重复排序分两类按索引 sort_index按字段 sort_values取极值用 nlargest随机拿数据直接 sample适合抽样测试。
返回列表