【数据分析基石】NumPy 与 Pandas 基础核心知识点全梳理

摘要:本文系统梳理了 Python 数据分析两大核心库 NumPy 和 Pandas 的关键知识点。从 NumPy 的数组创建、运算、统计到 Pandas 的 DataFrame 操作、数据清洗、合并聚合及文件读写,涵盖了数据分析的全流程。内容基于实战笔记整理,适合作为速查手册或入门复习指南。


📑 目录

  1. NumPy:数值计算的核心
    • 1.1 核心优势与 ndarray 属性
    • 1.2 数组的创建与转换
    • 1.3 随机数与等差等比数列
    • 1.4 基本运算与广播机制
    • 1.5 统计函数与排序去重
    • 1.6 矩阵点积
  2. Pandas:数据处理的神器
    • 2.1 数据结构:Series 与 DataFrame
    • 2.2 数据的创建与属性查看
    • 2.3 数据切片与查询(loc/iloc)
    • 2.4 数据赋值、排序与逻辑运算
    • 2.5 统计分析与自定义函数 (apply)
    • 2.6 文件读写 (CSV & MySQL)
  3. Pandas 进阶操作
    • 3.1 增删改查实战
    • 3.2 缺失值处理全流程
    • 3.3 数据合并 (Concat & Merge)
    • 3.4 分组聚合 (GroupBy)
    • 3.5 交叉表与透视表
  4. 总结

1. NumPy:数值计算的核心

NumPy 是 Python 科学计算的基础包,其核心对象是 ndarray(多维数组)。它的主要优势在于速度快,并且是 Pandas 的底层依赖,强烈推荐使用。

1.1 核心优势与 ndarray 属性

核心属性速查:

表格

属性/方法 描述
ndim 维度数量
shape 数组形状 (行, 列)
size 元素总个数
itemsize 单个元素的字节大小
dtype 元素数据类型
type() 容器类型 (通常为 <class 'numpy.ndarray'>)

类型转换:

import numpy as np

arr = np.array([1.5, 2.5, 3.5])
# 转换为整数类型
new_arr = arr.astype(int) 

1.2 数组的创建与转换

手动创建:

# 从列表创建
arr1 = np.array([1, 2, 3, 4, 5])

# arange: 类似 range,支持步长和 dtype
arr2 = np.arange(0, 10, 2, dtype=float) 

1.3 随机数与等差等比数列

随机创建:

  • np.random.rand(): 生成 0~1 之间的随机数,指定形状。
  • np.random.randint(low, high, size): 指定范围的整数。
  • np.random.uniform(low, high, size): 指定范围的浮点数。
# 生成 3行5列,范围 -5 到 5 的均匀分布随机数
array3 = np.random.uniform(-5, 5, size=(3, 5))
# 生成整数随机数
array4 = np.random.randint(-5, 5, size=(3, 5))

等差与等比:

  • np.linspace(start, stop, num): 等差数列(指定元素个数)。
  • np.logspace(start, stop, num, base): 等比数列(指定起始幂、结束幂、底数)。

1.4 基本运算与广播机制

NumPy 支持广播机制:先广播对齐,后进行运算。

  • array - array: 形状必须相同,否则报错。
  • array - 单值: 支持,单值会广播到整个数组。

常用函数:

  • np.ceil(): 向上取整
  • np.floor(): 向下取整
  • np.rint(): 四舍五入
  • np.isnan(): 判断是否为空 (NaN)
  • np.multiply()np.divide()np.abs(): 广播乘、除、绝对值
  • np.where(condition, x, y): 三元表达式判断

1.5 统计函数与排序去重

统计函数:

np.sum(arr), np.mean(arr) # 均值 (同 avg)
np.max(arr), np.min(arr)
np.argmax(arr), np.argmin(arr) # 最大/小值的索引
np.cumsum(arr) # 累加
np.cumprod(arr) # 累乘
np.var(arr), np.std(arr) # 方差,标准差

排序:

  • np.sort(arr): 返回排序后的新副本
  • arr.sort(): 直接修改原数组。
  • 倒序技巧:使用切片 [::-1]
    arr[::-1, ::-1] # 行倒序,列也倒序
    arr[-1, -1]     # 获取最后一行最后一列的元素

去重:

  • np.unique(arr): 合并子容器并去重,返回排序后的唯一值。

1.6 矩阵点积

别名:向量内积。
前提arr1 的列数必须等于 arr2 的行数。
规则:结果行数取决于 arr1,列数取决于 arr2

# 两种写法等价
res1 = np.dot(arr1, arr2)
res2 = arr1 @ arr2 

2. Pandas:数据处理的神器

Pandas 建立在 NumPy 之上,提供了高级的数据结构和分析工具。

2.1 数据结构概览

  • DataFrame: 二维表格 (Table),类似 Excel 或 SQL 表。
  • Series: 一维数组 (Column),DataFrame 的每一列就是一个 Series。
  • Index: 索引标签。
  • Columns: 列名。

2.2 Series 的创建与属性

4种创建方式: List, Tuple, Dict, Array。

import pandas as pd

s1 = pd.Series([1, 2, 3, 4, 5, 6], index=['A', 'B', 'C', 'D', 'E', 'F'])

# 属性
s1.index   # 索引列
s1.values  # 值列
s1['A']    # 获取索引对应的值

2.3 DataFrame 的创建与属性

df = pd.DataFrame(data=数据, columns=['col1', 'col2'], index=['row1', 'row2'])

常用属性:

  • shape: 形状 (行, 列)
  • indexcolumns: 行/列索引
  • values: 纯数值数组
  • T: 行列转置

特殊数据类型:

  • datetimepd.to_datetime() 转换。
  • timedelta: 时间差运算 (dt1 - dt2)。
  • category: 分类类型。
    • 优势:内存少、操作快。
    • 场景:有限集合(如性别、省份)。可通过 astype('category') 转换。

2.4 数据切片与查询

  1. 基础索引df['列名'] 获取列;df['列名']['行索引'] 获取具体值。
  2. 标签切片 (loc):基于索引标签,包含结束位置。
    df.loc[行起始:行结束, 列起始:列结束]
  3. 位置切片 (iloc):基于整数下标,不包含结束位置(类似 Python 切片)。
    df.iloc[行起始:行结束, 列起始:列结束]

2.5 数据赋值、排序与逻辑运算

赋值:

df['新列'] = 单值 / list / Series
df['列名']['行索引'] = 单值

排序:

  • df.sort_values(by='列名', ascending=False): 按值排序。
  • df.sort_index(ascending=True): 按索引排序。

逻辑运算(注意括号):
Pandas 中逻辑运算符优先级较高,条件必须加括号!

  • & (且), | (或), ~ (非)
# 错误示范:df[df['open'] > 23 & df['open'] < 24] 
# 正确示范:
result = df[(df['open'] <= 23) | (df['open'] >= 24)]

逻辑函数:

  • df.query("open > 23 and open < 24"): 类 SQL 写法。
  • # 语法:df.query("条件表达式")
    # 注意:query 内部支持 not, and, or 关键字,不需要 & | ~
    result = df.query("open <= 23 or open >= 24")
  • df['col'].isin([val1, val2]): 等同于 SQL 的 IN

2.6 统计分析与自定义函数

统计函数:

  • median: 中位数
  • mode: 众数
  • idxmaxidxmin: 最大/小值的索引
  • axis 参数:0 (默认,按列统计), 1 (按行统计)。
  • 其他:summeanstdvarcountmaxminabsprod.

累计值函数:
cumsum (累加), cumprod (累乘), cummaxcummin。Series 和 DataFrame 均适用。

Apply 自定义函数:

def my_func(x):
    return x * 2

# axis=0: 按列,传入 Series; axis=1: 按行,传入 Row 对象
df.apply(my_func, axis=0) 

2.7 文件读写

CSV 读写:

# 读
df = pd.read_csv('file.csv', sep=',', usecols=['col1'], index_col='id')
# 注意:确保每列都有列名,否则易出 Bug

# 写
df.to_csv('out.csv', sep=',', columns=['col1'], index=False, index_label='ID')

MySQL 读写 (需 SQLAlchemy):

from sqlalchemy import create_engine

# 1. 创建引擎
engine = create_engine('mysql+pymysql://user:pwd@ip:port/db_name')

# 2. 读写
with engine.begin() as conn:
    df_db = pd.read_sql('SELECT * FROM table', con=conn)
    df_db.to_sql('table_name', con=conn, if_exists='append', index=False)

3. Pandas 进阶操作

3.1 增删改查实战

增加列:

  1. 直接赋值:简单快捷 (df['new'] = ...)。
  2. assign:灵活,支持链式调用,可传入函数 (df.assign(new=lambda x: x['old']*2))。

删除列/行:

  1. drop:返回新对象,不修改原数据。
    df.drop(columns=['col1'], axis=1) # 删列
    df.drop(index=['row1'], axis=0)   # 删行
  2. del:直接修改原数据,慎用 (del df['col1'])。

修改列/值:

  • 直接改:df.GDP = 666
  • assign: df = df.assign(GDP=888)
  • replace: 
    • df.replace({旧值: 新值}) -> 改内容  或  df['列名'].replace(旧值, 新值)
    • df.rename(columns={旧列名: 新列名}) -> 改名字

排名函数 (rank):
模拟 SQL 窗口函数:

  • method='min': 并列名次相同,后续名次跳过 (1, 2, 2, 4) -> RANK()
  • method='dense': 并列名次相同,后续名次连续 (1, 2, 2, 3) -> DENSE_RANK()
  • 参数:ascendingpct (百分比), na_option (null 排前/后)。

3.2 缺失值处理全流程

判断缺失:

  • isnull(): 空为 True。
  • notnull(): 空为 False。
  • 全局判断:np.all(pd.notnull(df)) (True 表示无空值)。

处理策略:

  1. 替换特殊符号为 NaNdf.replace({'?': np.nan}, inplace=True)
  2. 删除df.dropna()
  3. 填充df.fillna(value)

3.3 数据合并

Concat (类似 UNION ALL):
主要用于行合并,也可按索引列合并。

pd.concat([df1, df2], axis=0) # 默认行合并

Merge (类似 JOIN):
用于列合并,基于关联字段。

pd.merge(left=df1, right=df2, how='inner', on='key')
# how: inner, left, right, outer
# 若关联字段名不同:left_on='k1', right_on='k2'

3.4 分组聚合 (GroupBy)

groupby 返回的是中间对象,无法直接查看,需配合聚合函数。

grp = df.groupby('category')

# 常用操作
grp.first() / grp.last()      # 每组第一/最后一行
grp.get_group('A')            # 获取特定组明细
grp.agg({'sales': 'sum', 'price': 'mean'}) # 多列多函数聚合
grp.filter(lambda x: x['sales'].sum() > 100) # 过滤组

3.5 交叉表与透视表

交叉表 (crosstab):
主要用于统计频次 (Count)。

pd.crosstab(df['行分类'], df['列分类'])

透视表 (pivot_table):
功能更强大,支持任意聚合函数。

pd.pivot_table(df, 
               values='值', 
               index='索引', 
               columns='列名', 
               aggfunc='sum') # 或 mean, count 等

4. 总结

本文涵盖了从 NumPy 底层数组操作到 Pandas 高层数据处理的完整知识体系。

  • NumPy 擅长高性能数值计算和矩阵运算。
  • Pandas 则是数据清洗、分析和探索的利器,其 DataFrame 结构完美契合表格数据。

掌握这些核心 API(如 mergegroupbyapplyloc/iloc),将能解决 90% 以上的日常数据分析需求。建议结合真实数据集进行练习,以加深理解。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐