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)

1eea54d7f082ac44e5d3a9b9f71850f5

379d6b247540ad808d7f441177083c0b

5e07112296784caac759214b3c79d1df

posted @ 2026-06-09 17:04  RReally  阅读(28)  评论(0)    收藏  举报
//一下两个链接最好自己保存下来,再上传到自己的博客园的“文件”选项中