尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Pandas 核心与数据筛选学习笔记

Pandas 核心与数据筛选学习笔记 NumPy 擅长处理类型统一的数值数组而 CSV、Excel 等真实表格通常包含列名、索引和多种数据类型。Pandas 在 NumPy 之上提供了更适合表格分析的数据结构。本篇重点复盘Series、DataFrame、索引选择与条件筛选。一、Series 与 DataFramePandas 最核心的两个对象是Series带标签的一维数据可以理解为表格中的一列DataFrame带行索引和列名的二维数据可以理解为一张表。import pandas as pd scores pd.Series( [90, 85, 92], index[张三, 李四, 王五], namescore, ) students pd.DataFrame({ Name: [Allen, Claire, Dave], Age: [20, 38, 26], Survived: [0, 1, 1], })Series由值、索引和名称组成DataFrame则由多列Series共同构成。读取外部表格时通常使用df pd.read_csv(train.csv)拿到一个陌生的 DataFrame 后不要马上筛选或修改应先检查print(df.shape) # 行数和列数 print(df.columns) # 列名 print(df.dtypes) # 每列的数据类型 print(df.head()) # 前 5 行这一步可以提前发现列名拼写、类型错误和文件读取异常。二、Series 的标签对齐Series 与列表、NumPy 数组的重要区别是运算时会按照标签对齐而不是单纯按照位置计算a pd.Series([1, 2], index[x, y]) b pd.Series([10, 20], index[y, x]) result a b print(result)结果中x为1 20 21y为2 10 12。如果双方存在不一致的标签对应结果可能变为NaN。因此数据计算前不仅要检查长度还要检查索引是否符合预期。Series 可以通过标签和位置两种方式取值print(scores.loc[李四]) # 按标签 print(scores.iloc[1]) # 按位置三、选择 DataFrame 的列选择一列和选择多列的返回类型不同age_series students[Age] info_table students[[Name, Age]]df[Age]返回Seriesdf[[Name, Age]]返回DataFrame。多列选择必须使用双层方括号。df[Age, Name]会把元组当作一个列标签通常触发KeyError。也可以使用df.Age访问列但列名含空格、与方法重名或不是合法标识符时容易失败因此正式代码更推荐df[Age]。四、索引设置与恢复DataFrame 默认使用从 0 开始的整数索引也可以将具有业务含义的字段设为行索引indexed students.set_index(Name) print(indexed.loc[Claire, Age]) restored indexed.reset_index()学号、订单号和PassengerId等唯一标识适合作为索引姓名可能重复通常不适合作为唯一键。Pandas 允许重复索引此时df.loc[某标签]可能返回多行后续连接、修改和统计更容易产生歧义。五、布尔索引与单条件筛选条件表达式会生成一个与行数相同的布尔 Series再由 DataFrame 保留值为True的行older students[students[Age] 25] survivors students[students[Survived] 1]缺失值也可以直接筛选missing_age students[students[Age].isna()] valid_age students[students[Age].notna()]可以把布尔索引理解为“先生成筛选掩码再用掩码选行”。调试时把条件单独打印出来往往比直接阅读整条筛选语句更直观。六、多条件筛选Pandas 多条件筛选使用、|和~分别表示且、或、非并且每个条件都要用括号包裹result students[ (students[Age] 25) (students[Survived] 1) ]多个候选值可以使用isin()通常比连续写多个“或”更清晰result students[students[Age].isin([20, 26])]不能用 Python 的and、or、not连接 Series 条件因为它们要求把整个 Series 判断为单个真假值Pandas 会报“布尔值不明确”的错误。对于可读性要求较高的条件也可以使用query()result students.query(Age 25 and Survived 1)需要注意普通布尔索引使用 | ~而query()的字符串表达式中可以使用and or not。七、loc 与 iloc这是 Pandas 初学阶段最容易混淆的内容方法依据切片右端loc行列标签通常包含iloc整数位置不包含df pd.DataFrame( {Age: [10, 20, 30, 40]}, index[a, b, c, d], ) print(df.loc[a:c, Age]) # 包含标签 c print(df.iloc[0:3, 0]) # 位置 0、1、2记忆方式很简单写标签或列名时使用loc表达“第几行、第几列”时使用iloc。尤其不要因为默认索引恰好也是整数就把标签和位置混为一谈。八、筛选行、选择列与安全赋值loc可以同时完成条件筛行与指定列选择subset students.loc[ students[Age] 25, [Name, Age], ]修改满足条件的数据时也应优先使用一次loc操作students.loc[students[Age] 30, Age] 30不要先筛选再链式赋值例如df[df[Age] 30][Age] 30。这种写法可能修改的是临时对象并触发链式赋值警告结果也不够可靠。九、结构转换Pandas 可以与字典、NumPy 数组灵活转换age_df students[Age].to_frame() data_dict students.to_dict(orientlist) data_array students.to_numpy()需要保留列名和索引语义时继续使用 DataFrame进入纯数值矩阵计算时再转换为 NumPy。转换为数组后列名和行索引不会随数值一起保留因此应先明确列顺序和数据类型。十、缺失值对筛选的影响真实数据中经常存在缺失值。数值列含有NaN时类似df[Age] 30的比较不会选中缺失行它们也不会自动归入相反条件。因此如果分析要求明确区分“年龄不超过 30”和“年龄未知”应分别处理known df[df[Age].notna()] unknown df[df[Age].isna()] older known[known[Age] 30]读取 CSV 后可以先统计每列缺失数量print(df.isna().sum())不要为了让筛选语句运行就随意把缺失值填成 0因为 0 往往具有真实业务含义。删除、填充或单独标记缺失数据应根据字段含义和分析目标决定。十一、真实表格的筛选流程对 Titanic 等真实数据进行筛选时可以遵循以下步骤使用read_csv()读取文件确认路径、编码和分隔符检查shape、列名、数据类型和缺失数量先把筛选条件保存为布尔变量并统计mask.sum()使用loc[mask, columns]同时筛选行和所需列检查结果的行数、列名、索引以及关键字段范围若要继续修改视需要使用.copy()创建明确副本。mask (df[Pclass] 1) (df[Survived] 1) result df.loc[mask, [Name, Age, Sex]].copy() print(筛选人数, mask.sum()) print(result.head())把条件、选列和结果检查拆开既便于调试也能避免长表达式中列名或逻辑符号写错后难以定位。十二、常见错误总结多列选择忘记双层方括号混淆 Series 与单列 DataFrame忽略 Series 运算的标签对齐多条件筛选使用and、or或忘记给条件加括号混淆loc的标签切片与iloc的位置切片使用链式赋值修改筛选结果读取数据后未检查shape、columns、dtypes和缺失值。总结Pandas 数据筛选的核心不是记住大量 API而是分清三组概念Series 与 DataFrame、标签与位置、条件掩码与最终结果。实际分析时应先检查表格结构再生成条件最后使用loc明确选择行列或完成赋值。只要始终关注返回对象的类型、索引和形状就能避开大多数初学错误。
返回列表