python学习笔记——pandas篇
https://www.cnblogs.com/wsyl/p/19839764
见这篇博客
此处补充排序相关的知识点:
Series创建的补充知识
Series 是 Pandas 中的带标签一维数组(labeled array),由两部分组成:
values:实际存储的数据
index:数据对应的标签 / 索引
二、创建 Series 的 3 种方式
1. 从 ndarray 创建
直接传入 NumPy 数组或 Python 列表,并可指定索引:
import pandas as pd
import numpy as np
# 方式1:从列表创建,指定索引
s1 = pd.Series([1.0, 2.0, 3.0], index=["a", "b", "c"])
# 方式2:从随机数组创建,用 list("abcde") 生成索引
s3 = pd.Series(np.random.rand(5), index=list("abcde"))
2. 从字典创建
字典的 key 会自动成为 Series 的索引,value 成为数据:
# 方式1:直接传入字典
pd.Series({"b": 1, "a": 0, "c": 2})
# 方式2:用 zip 拼接列表和数组,再转字典创建
pd.Series(dict(zip(list("abcde"), np.arange(5))))
3. 从标量值创建
传入单个值时,该值会被重复填充到所有索引位置:
pd.Series(10, index=list("abc"))
a 10
b 10
c 10
dtype: int64
Series 核心操作
| 操作分类 | 核心语法 | 代码示例 | 功能说明 |
|---|---|---|---|
| 二、索引与切片 | 位置索引 | s[0] | 按数字下标取对应位置的元素,和 NumPy 数组索引逻辑完全一致 |
| 标签索引 | s["a"] | 按自定义的索引标签取对应元素,精准定位带标签的业务数据 | |
| 切片操作 | s[1:3] / s["b":"d"] | 按位置 / 标签范围取连续数据,结果会完整保留原索引与数据的对应关系 | |
| s.get("a", 这里放找不到返回的default值) | print(s.get("a", np.nan)) # 输出:s["a"](存在,返回值) | 输出:nan(不存在,返回默认值) | |
| 三、筛选与运算 | 布尔条件筛选 | s[s > s.median()] | 按条件筛选符合要求的元素,结果始终保留原索引,不会出现索引与数据错位 |
| 聚合统计运算 | s.median() / s.mean() / s.sum() | 支持中位数、均值、求和等常用统计函数,直接对 Series 的数值进行批量计算 | |
| 向量化运算 | s * 2 / s + 10 | 支持加减乘除等向量化运算,对所有元素批量操作,无需手动写循环 | |
| 四、命名与类型转换 | 创建时命名 | pd.Series([1,2,3], name="values") | 创建 Series 时指定 name 属性,后续合并为 DataFrame 时会自动成为对应列名 |
| 重命名操作 | s.rename("new_name") | 对已有的 Series 重命名,默认返回新对象;加inplace=True可直接修改原对象 | |
| 转为 NumPy 数组 | s.to_numpy() | 将 Series 的数值部分转为纯 NumPy 数组,丢弃索引标签,适配仅需数组的计算场景 |
Pandas Series 索引对齐(Index Alignment)详解
一、核心规则:索引对齐机制
Series 之间运算时,会以索引标签为依据自动对齐数据,与元素顺序无关。
索引相同的元素,会按位置对应执行运算
一方存在、另一方不存在的索引,结果默认填充 NaN
二、索引对齐的 3 种典型场景
| 场景 | 示例代码 | 运算结果说明 |
|---|---|---|
| 索引完全相同,顺序一致 | s1 = pd.Series([1,2,3], index=["a","b","c"])s2 = pd.Series([4,5,6], index=["a","b","c"])s1 + s2 | a:5.0, b:7.0, c:9.0,对应索引直接相加 |
| 索引完全相同,顺序不同 | s3 = pd.Series([4,5,6], index=["b","c","a"])s1 + s3 | 按标签对齐后相加:a:1+6=7.0, b:2+4=6.0, c:3+5=8.0,结果自动按原索引排序 |
| 索引不完全重叠 | s4 = pd.Series([4,5,6], index=["b","c","d"])s1 + s4 | 共同索引正常运算(b:6.0, c:8.0),仅一方存在的索引填充 NaN(a:NaN, d:NaN) |
索引之间相互运算的一些重要方法
| 方法 / 操作 | 用途 | 适用场景 |
|---|---|---|
| + 运算符 | 直接相加,默认按索引对齐 | 索引完全重叠,无需处理缺失值 |
| .add(other, fill_value=0) | 相加并指定缺失值填充值 | 部分索引重叠,需统一处理缺失值 |
| .reindex(names).fillna(0) | 先对齐索引再填充缺失值 | 需单独处理缺失值,再执行运算 |
| salaries_list[bonus.index] += bonus | 仅对有奖金的员工更新 | 不想修改无奖金员工的数据,直接操作原 Series |
如何创建一个Dataframe
| 创建方式 | 代码示例 | 核心规则 |
|---|---|---|
| 1. 从单个 Series 创建 | s = pd.Series([4,5,6], index=list("bca")) pd.DataFrame(s) | - Series 的 index 成为 DataFrame 的行索引 - 未命名 Series 默认列名为 0 - 命名 Series 的 name 属性会自动成为列名 |
| 2. 从 Series 字典创建 | pd.DataFrame({"one": s, "two": s2}) | - 字典的 key 自动成为列名 - 所有 Series 的 index 会自动对齐,成为统一的行索引 - 索引不重叠的位置填充 NaN |
| 3. 从 NumPy 数组创建 | data = np.array([(1, 2.0, "Hello"), (2, 3.0, "World")]) pd.DataFrame(data, index=["first","second"], columns=["id","value","string"]) | - 默认行索引 / 列索引为 0,1,2... - 可通过 index 和 columns 参数自定义标签 - 数组元素会统一转为字符串类型(U32) |
| 4. 从字典列表创建 | data2 = [{"a":1,"b":2}, {"a":5,"b":10,"c":20}] pd.DataFrame(data2) | - 每个字典代表一行数据,key 为列名 - 缺失的 key 对应位置填充 NaN - 可通过 columns 参数指定显示的列,未指定列自动填充 NaN |
| 5. 从文件读取创建 | pd.read_excel("file.xlsx") pd.read_csv("file.csv") | - 直接读取 Excel/CSV 文件生成 DataFrame - 可通过 index_col、usecols 等参数指定索引和列 |
| 6. 从示例数据集创建 | import seaborn as sns df = sns.load_dataset("anscombe") | - 加载 Seaborn 等库自带的示例数据集,快速生成 DataFrame |
Pandas DataFrame 核心操作速查表
以下是幻灯片中所有 DataFrame 核心功能的结构化整理,方便你复习和查阅:
一、DataFrame 信息查看与统计
| 方法 | 功能说明 | 使用规则 | 示例 | 返回值 |
|---|---|---|---|---|
| df.info() | 查看整体信息:行列数、列名、非空值、数据类型、内存占用 | 无返回,直接控制台打印信息,无额外参数 | df.info() | None(仅输出文本,不返回数据对象) |
| df.describe() | 输出数值列统计:计数、均值、标准差、四分位数、最值 | 默认仅统计数值型列;可指定include包含其他类型 | df.describe() | DataFrame,行为统计指标,列为原数据列 |
| df.count() | 统计非空元素数量 | 默认axis=0按列统计;axis=1按行统计,自动忽略 NaN | df.count() | Series,索引为列名 / 行号,值为对应非空数量 |
| df.mean() | 计算平均值 | 仅对数值列生效,自动忽略 NaN;支持axis指定轴 | df.mean() | Series,索引为列名 / 行号,值为对应均值 |
| df.std() | 计算标准差 | 默认计算样本标准差 (ddof=1),自动忽略 NaN;支持axis | df.std() | Series,索引为列名 / 行号,值为对应标准差 |
| df.min() | 计算最小值 | 数值列取最小,字符串列按字典序取最小,忽略 NaN | df.min() | Series,索引为列名 / 行号,值为对应最小值 |
| df.max() | 计算最大值 | 数值列取最大,字符串列按字典序取最大,忽略 NaN | df.max() | Series,索引为列名 / 行号,值为对应最大值 |
| df.sum() | 求和运算 | 数值列累加,字符串列拼接,忽略 NaN;支持axis | df.sum() | Series,索引为列名 / 行号,值为对应求和结果 |
二、DataFrame 数据选择与列操作
| 操作方式 | 功能说明 | 示例 |
|---|---|---|
| df['列名'] | 选择单列,返回 Series 对象 | df['b'] |
| df['新列名'] = 表达式 | 添加 / 修改列,支持直接运算赋值 | df['e'] = df['a'] + df['b'] |
| df['flag'] = df['e'] > 2 | 创建布尔列,标记符合条件的行 | df['flag'] = df['e'] > 2 |
四、DataFrame 合并:pd.merge()
功能:按指定列(key)将两个 DataFrame 合并为一个表,类似 SQL 的 JOIN 操作
pd.merge(left, right, on="key(指定的列名)")
left:左表,right:右表
on="key":指定合并依据的列名,结果会按 key 匹配并合并两表的列
# 按 行索引 合并
result = pd.merge(left, right,
left_index=True, # 用左表的索引
right_index=True) # 用右表的索引
五、DataFrame 分组操作:groupby()
| 分组方式 | 示例 | 说明 |
|---|---|---|
| 单列分组 | df.groupby("A").sum() | 按列 A 的值分组,对所有数值列求和 |
| 多列分组 | df.groupby(["A", "B"]).sum() | 按列 A 和 B 的组合值分组,对所有数值列求和 |
| 分类 | 语法格式 | 示例代码 | 功能说明 | 返回值 | 补充规则 |
|---|---|---|---|---|---|
| 单列分组聚合 | df.groupby(分组列).聚合方法() | df.groupby("班级").mean() | 按单列分组,对所有数值列执行聚合计算 | DataFrame,分组字段为行索引 | 默认忽略缺失值 NaN |
| 单列 + 指定列聚合 | df.groupby(分组列)[目标列].聚合方法() | df.groupby("班级")["成绩"].sum() | 按单列分组,仅对指定一列做聚合 | Series,索引为分组值 | 日常高频用法,减少冗余计算 |
| 多列组合分组 | df.groupby([列1,列2]).聚合方法() | df.groupby(["班级","性别"]).max() | 按多列组合条件分层分组 | 多层索引 DataFrame | 分组顺序影响层级结构 |
| 统计每组行数 | df.groupby(分组列).size() | df.groupby("班级").size() | 统计每个分组的总行数(含空值行) | Series | 常用统计分组样本量 |
| 统计每组非空值 | df.groupby(分组列).count() | df.groupby("班级").count() | 统计每个分组内各列非空元素数量 | DataFrame | 只计算有效数据,自动跳过 NaN |
| 单字段多聚合 | df.groupby(分组列)[目标列].agg([函数1,函数2]) | df.groupby("班级")["成绩"].agg(["mean","max","min"]) | 同一列一次性执行多种聚合运算 | DataFrame,列名为聚合函数名 | 支持内置字符串简写:mean/max/min/sum/count |
| 多字段不同聚合 | df.groupby(分组列).agg({列1:函数, 列2:函数}) | df.groupby("班级").agg({"成绩":"mean","年龄":"max"}) | 不同列设置不同的聚合规则 | DataFrame | 字典键为列名,值为聚合函数名 |
| 遍历分组数据 | for name, data in df.groupby(分组列): print(name, data) | for cls,data in df.groupby("班级"): print(cls, data) | 循环取出分组名和分组内完整数据 | 无返回,遍历输出 | 可对每组数据单独做自定义处理 |
| 分组后排序 | 分组结果.sort_values(ascending=布尔值) | df.groupby("班级")["成绩"].mean().sort_values(ascending=False) | 分组聚合后,按结果升 / 降序排列 | Series/DataFrame | 搭配排序实现排名需求 |
| 分组后重置索引 | 分组结果.reset_index() | df.groupby("班级").mean().reset_index() | 将分组层级索引转为普通列,恢复标准表格结构 | DataFrame | 解决分组后索引错乱问题,方便后续操作 |
一、DataFrame 排序
1. 按值排序:sort_values()
作用:按指定列的值对行进行排序。
# 核心语法
df.sort_values(by="列名", ascending=True/False, inplace=False)
# 示例:按“成绩”列降序排序
df_sorted = df.sort_values(by="成绩", ascending=False)
print("按成绩降序:\n", df_sorted)
by:指定排序依据的列名(也可以传入列表,实现多列排序,如 by=["班级", "成绩"])
ascending:True 为升序(默认),False 为降序
inplace=True:直接修改原 DataFrame,不返回新对象,不写默认返回新对象
2. 按索引排序:sort_index()
作用:按行索引(或列索引)的顺序排序。
# 核心语法
df.sort_index(axis=0, ascending=True/False, inplace=False)
# 示例:按行索引升序排序
df_sorted_index = df.sort_index()
print("\n按索引升序:\n", df_sorted_index)
axis=0:按行索引排序(默认);axis=1 可按列名排序
常用于索引被打乱后,恢复原始顺序
二、Series 排序
Series 作为单列数据,排序逻辑与 DataFrame 一致:
# 示例:获取“成绩”列并降序排序
s_sorted = df["成绩"].sort_values(ascending=False)
print("成绩降序:\n", s_sorted)
sort_values():按值排序,参数与 DataFrame 一致
sort_index():按 Series 的索引排序
补充:多列排序示例
# 先按“班级”升序,再按“成绩”降序排序
df_multi_sort = df.sort_values(by=["班级", "成绩"], ascending=[True, False])
print("多列排序结果:\n", df_multi_sort)
关键注意事项
排序默认返回新对象,原数据不会被修改,除非指定 inplace=True
排序后行索引会跟着原来的那一行乱跑,如需重置索引,可在排序后加上 .reset_index(drop=True)
为什么要使用reset_index(drop=True)




浙公网安备 33010602011771号