pandas 在使用时语法感觉很乱,有什么学习的技巧吗?- 奕高的回答 - 知乎 https://www.zhihu.com/question/289788451/answer/2167204031 ## 索引器对象 - **语法**:只有 `[]` 才能触发订阅操作(`__getitem__` / `__setitem__`),圆括号不具备这一语义。 - **pandas**:`df.loc`、`df.iloc` 本质是索引器对象,规定“**用方括号表达我想取什么**”。 - **代码可读性**:在整个科学计算生态中,`[]` 已经约定俗成地代表“索引/切片”,保持一致能减少认知负担。 ## DataFrame ![CleanShot 2025-05-02 at [email protected]|1000](https://imagehosting4picgo.oss-cn-beijing.aliyuncs.com/imagehosting/fix-dir%2Fmedia%2Fmedia_FQKT0tTUKY%2F2025%2F05%2F02%2F15-43-48-f64a4b992f3086bcf56ae60f67f456aa-CleanShot%202025-05-02%20at%2015.43.05-2x-8b7998.png) DataFramed 的本质是`Map<String, List>`,而 ndArray 的本质是 `List<List>` DataFrame 是 pandas 库中最常用的数据结构之一。你可以把它想象成一个表格或者电子表格,就像 Excel 里的工作表。这个 " 表格 " 有行和列: 1. 每一列代表一种类型的数据 (比如姓名、年龄、成绩等)。 2. 每一行代表一条完整的记录。 NumPy的核心数据结构是ndarray(N-dimensional array,N维数组)。这与pandas的DataFrame有些不同,更像是Java中的数组,但可以有多个维度。 - 所有元素类型相同,这使得操作更快,NumPy的ndarray更适合数学运算和科学计算。 - pandas的DataFrame更适合处理表格型数据,特别是当你需要不同类型的数据或带标签的数据时。 实际上,pandas的DataFrame在内部使用了NumPy的ndarray。你可以把DataFrame看作是在ndarray基础上增加了更多功能的数据结构。 以下是从本教程中提取的 **pandas 高频 API cheatsheet**,按主题分类汇总,方便查阅学习: ## Pandas 高频 API Cheatsheet(按功能分类) ### 🧱 数据结构创建 | 功能 | API 示例 | 说明 | |------------------|-------------------------------------|-------------------------------| | 创建 Series | `pd.Series([1, 2, 3])` | 创建一维数组 | | 创建 DataFrame | `pd.DataFrame({'A':[1,2],'B':[3,4]})`| 创建二维表格结构 | ### 📂 数据导入导出 | 功能 | API 示例 | 说明 | |------------------|-------------------------------------|-------------------------------| | 读取 CSV | `pd.read_csv('file.csv')` | 从 CSV 文件读取 | | 写入 CSV | `df.to_csv('file.csv', index=False)`| 保存为 CSV 文件 | ### 🔍 数据选择与筛选 | 功能 | API 示例 | 说明 | |------------------|-------------------------------------|-------------------------------| | 按标签选择 | `df.loc['a', 'A']` | 按索引和列名选择 | | 按位置选择 | `df.iloc[0, 1]` | 按整数位置选择 | | 切片选择 | `df.loc['a':'c',['A', 'B']]` | 标签范围选择子集 | | 布尔筛选 | `df[df['A']> 10]` | 条件筛选行 | ### ✏️ 常见列操作 | 功能 | API 示例 | 说明 | |------------------|-------------------------------------|-------------------------------| | 添加新列 | `df['C']= df['A']+ df['B']` | 基于现有列计算新列 | | 删除列 | `df.drop(columns=['B'])` | 删除指定列 | | 重命名列 | `df.rename(columns={'A':'Alpha'})` | 修改列名 | | 排序行 | `df.sort_values(by='A', ascending=False)` | 按列排序 | | 唯一值 | `df['A'].unique()` | 返回唯一值数组 | | 值频统计 | `df['A'].value_counts()` | 各唯一值出现次数 | ### ❓ 缺失值处理 | 功能 | API 示例 | 说明 | |------------------|-------------------------------------|-------------------------------| | 检测缺失值 | `df.isnull()` | 返回布尔矩阵标记缺失位置 | | 填充缺失值 | `df.fillna(0)` | 将缺失值替换为指定值 | | 删除含缺失行 | `df.dropna()` | 删除包含任意 NaN 的行 | | 删除全缺失行 | `df.dropna(how='all')` | 删除整行都是 NaN 的行 | ### 📊 分组与聚合 | 功能 | API 示例 | 说明 | |------------------|-------------------------------------|-------------------------------| | 分组 | `df.groupby('Category')` | 按某列分组 | | 聚合求和 | `df.groupby('Category')['Value'].sum()` | 每组求和 | | 聚合平均 | `df.groupby('Category')['Value'].mean()`| 每组平均值 | | 聚合计数 | `df.groupby('Category')['Value'].count()`| 每组元素个数 | ### 🔗 拼接与合并 |操作|行数变化|列数变化|键的保留范围|常见用途| |---|---|---|---|---| |`concat` (纵向)|行 +=|列 =|不看键|把同结构数据分批汇总| |`merge`-inner|≤|= 或 +|**交集**|只要双方都有的记录| |`merge`-outer|≥|= 或 +|**并集**|全量对齐,后续清洗| > 若想只保留左表全部行,用 `how='left'`; > 只保留右表全部行,用 `how='right'`。 | 功能 | API 示例 | 说明 | |------------------|-------------------------------------|-------------------------------| | 行拼接(concat)| `pd.concat([df1, df2], ignore_index=True)` | 沿 axis=0 合并 | | 合并(merge)| `pd.merge(df1, df2, on='key')` | 类似 SQL 的 join 操作 | | 外连接 | `pd.merge(df1, df2, on='key', how='outer')`| 包含所有键,缺失补 NaN | ### 🔧 函数应用 | 功能 | API 示例 | 说明 | |------------------|-------------------------------------|-------------------------------| | 应用于 Series | `df['A'].apply(lambda x: x*2)` | 对每个元素应用函数 | | 字典映射 | `df['col'].map({'A':1, 'B':2})` | 将值映射为其他值 | | 按行 apply | `df.apply(func, axis=1)` | 将函数作用于每行(Series)| ### 🧪 类型转换 | 功能 | API 示例 | 说明 | | ------- | -------------------------------- | --------------- | | 改数据类型 | `df['A'].astype(float)` | 强制类型转换 | | 转换为日期时间 | `pd.to_datetime(df['date_str'])` | 字符串解析为 datetime | ### ⏱️ 时间序列操作 | 功能 | API 示例 | 说明 | |------------------|-------------------------------------|-------------------------------| | 创建日期索引 | `pd.date_range('2021-01-01', periods=10)` | 生成日期序列 | | 设置为时间索引 | `df.index = pd.to_datetime(df['date'])` | 指定为时间索引 | | 时间重采样 | `df.resample('M').sum()` | 以月份为单位汇总 |