📊 关注公众号「船长Talk」

每天更新数据分析实战技巧 · Python/SQL干货 · 职场真相 · 投资洞察

👉 微信搜索「船长Talk」即可关注

做数据分析,numpy 和 pandas 是两个绕不开的核心库。

很多同学学了一半就放弃了——不是因为难,而是没有一份系统整理过的笔记。

这篇文章把 numpy 核心操作 + pandas 常用方法 全部整理出来,每段代码都有详细注释,方便收藏查阅。

一、numpy 核心操作(详细代码注释)

01 创建 array 数组(能矢量计算)

# 公众号:船长Talk | Python数据分析干货每日更新

# 01 构造方法:从列表创建数组
import numpy as np
np.array([1, 2, 3, 4, 5])  # 一维数组

# 02 二维数组:嵌套列表 → 二维矩阵
data = [[1, 2, 3, 4], [5, 6, 7, 8]]
arr2 = np.array(data)
arr2.shape  # 输出形状 out(2,4)  2行 4 列

# 03 用元组创建 array
data3 = (1, 2, 3, 4, 5)  # tuple
arr3 = np.array(data3)
# arr3 → array([1,2,3,4,5])

# 04 构建全零、全一数组
arr6 = np.zeros((3, 2))       # 创建一个三行两列的全0数组
arr6_1 = np.zeros_like(arr6)  # 形状和arr6相同的全0数组
arr7 = np.ones((3, 2))        # 全1数组

# 05 正态分布数组(空数组,未初始化)
arr9 = np.empty(20)

# 06 有序构建:range步长不能为浮点型,arange()可以
arr10 = np.array(range(10))           # 普通range
arr10_1 = np.arange(1, 10, 0.1)      # arange支持浮点步长

# 07 随机数组
np.random.rand(10)                    # 均匀分布随机数
arr12 = np.random.randn(10000)        # 正态分布随机数组
arr12.mean()  # 计算平均数(接近0)
arr12.std()   # 计算标准差(接近1)

# 08 带形状的随机整数数组
np.random.seed(42)                    # 设置随机种子(保证可复现)
arr13 = np.random.randint(1, 100, 10).reshape(5, 2)  # 1-100的随机整数,reshape为5行2列

# 09 等间距数组(linspace)
arr14 = np.linspace(11, 21, 100, endpoint=False)  # 从11到21切100份,不含终点

# 10 单位矩阵(对角线为1,其余为0)
arr15 = np.eye(5)  # 5行5列的单位矩阵

02 numpy 常用方法汇总

# 公众号:船长Talk

# 01 numpy 属性与基本方法
import numpy as np
data1 = [[6, 7.5, 8, 0, 1], [1, 2, 3, 4, 5]]
arr1 = np.array(data1)

print(arr1.ndim)     # 输出数组维度的个数(2D数组→输出2)
print(arr1.shape)    # 输出数组的维度:几行几列
print(arr1.size)     # 输出数组的元素总数(m行n列 → m*n个元素)
print(arr1.dtype)    # 输出数组元素的类型(float64等)
print(arr1.itemsize) # 输出每个元素占用的字节大小

# 02 布尔索引(axis=0为行,=1为列)
names = np.array(['1', '2', '3', '4', '5', '6', '7'])
col = np.array(range(4))
data = np.random.randn(7, 4)
print(data[names == '2'])           # 原理:names=='2'生成bool数组,取True对应行
data[names == '2', col == 1]        # 行和列同时索引
data[names == '2', (col == 1) | (col == 2)]  # 逻辑或,先行后列

# 03 花式索引(按指定行号取行)
arr = np.random.randn(8, 4)
arr[[4, 1]]      # 先取第4行,再取第1行
arr[[4, 3, 7]]   # 取第4、3、7行
arr[[-1, -3, 3]] # 负索引:-1是最后一行

# 04 转置
arr.T           # 行列互换(属性)
arr.transpose() # 行列互换(方法)

# 05 常用数学函数
arr = np.array([1, np.e, np.e**2, 0])
print("最大值:%s" % np.max(arr))
print("最小值:%s" % np.min(arr))
print("e的次方:%s" % np.exp(arr))   # 以e为底求幂
print("自然对数:%s" % np.log(arr))  # 以e为底
print("开方:%s" % np.sqrt(arr))
print("平均值:%s" % np.mean(arr))
print("标准差:%s" % np.std(arr))
print("最小值位置索引:%s" % np.argmin(arr))
print("最大值位置索引:%s" % np.argmax(arr))
print("是否为无穷大:%s" % np.isinf(arr))

# 06 where条件选择(三元运算)
xarr = np.array([1.1, 1.2, 1.3])
yarr = np.array([2.1, 2.2, 2.3])
cond = np.array([True, False, True])
np.where(cond, xarr, yarr)  # cond为True取xarr,否则取yarr

# 07 排序
np.sort(arr)           # 默认按行排序
np.sort(arr, axis=1)   # 按列排序

# 08 堆叠(要求堆叠方向维度一致)
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])
np.hstack((a, b))  # 横向堆叠(往右拼接)
np.vstack((a, b))  # 纵向堆叠(往下拼接)

# 09 数据类型转换(自动向上转型)
np.arange(5, dtype='float64')  # 整数转浮点数

二、pandas 核心操作(详细代码注释)

03 创建 Series(nan类型是浮点型)

# 公众号:船长Talk

import numpy as np
import pandas as pd

# 创建 Series(带默认索引)
ser = pd.Series([10, 20, 30, 40])     # index默认 0,1,2,3
ser2 = pd.Series([10, 20, 30], index=['a', 'b', 'c'])  # 自定义index

# 引用
ser['a']      # 按标签索引
ser[0]        # 按位置索引

# 判断空值
ser.isnull()  # 返回bool Series,True表示是NaN
pd.isnull(ser)  # 等效写法

04 创建 DataFrame

# 公众号:船长Talk

import numpy as np
import pandas as pd

# 01 从字典创建 DataFrame(键名→列名)
data = {
    "city": ['北京', '上海', '广州', '深圳'],
    "year": [2020, 2021, 2022, 2023],
    'population': [2189, 2489, 1881, 1766]
}
frame = pd.DataFrame(data)

# 02 单列索引 → 返回Series
frame['year']

# 03 多列花式索引 → 返回DataFrame
frame[['population', 'city', 'year']]

# 04 增加不存在的列 → 值全部为NaN
frame2 = pd.DataFrame(data, columns=['population', 'city', 'year', 'debt'])
# debt列不在data中,所以值全为NaN

# 05 查看index(行标签)
frame2.index

# 06 查看values(返回numpy数组)
frame2.values

# 07 指定columns和index
frame2 = pd.DataFrame(
    data,
    columns=['population', 'city', 'year', 'debt'],
    index=['row1', 'row2', 'row3', 'row4']  # 注意:行数必须匹配,不能多指定
)

# 08 嵌套字典生成 DataFrame(外键→列名,内键→行名)
pop = {
    "北京": {2001: 2.4, 2002: 2.9},
    '上海': {2000: 1.5, 2001: 1.7, 2002: 3.6}
}
frame3 = pd.DataFrame(pop)
# out: "北京","上海"为列名,2000,2001,2002变成行名(缺失值为NaN)

05 DataFrame 索引操作

# 公众号:船长Talk

import pandas as pd
import numpy as np

# 创建测试数据
df = pd.DataFrame({
    'A': [1, 2, 3, 4],
    'B': [10, 20, 30, 40],
    'C': [100, 200, 300, 400]
}, index=['r1', 'r2', 'r3', 'r4'])

# --- 列索引 ---
df['A']           # 取A列(Series)
df[['A', 'B']]    # 取多列(DataFrame)

# --- 行索引(loc:标签,iloc:位置)---
df.loc['r1']          # 按标签取第1行
df.loc['r1':'r3']     # 按标签切片(含终点)
df.iloc[0]            # 按位置取第0行
df.iloc[0:3]          # 按位置切片(不含终点)

# --- 混合索引(先行后列)---
df.loc['r1', 'A']       # 取r1行A列的值
df.iloc[0, 0]           # 取第0行第0列的值
df.loc['r1':'r2', 'A':'B']  # 行列切片

# --- 条件过滤 ---
df[df['A'] > 2]          # A列大于2的行
df[(df['A'] > 1) & (df['B'] < 40)]  # 多条件(用&代替and)

# --- 赋值 ---
df['D'] = [1000, 2000, 3000, 4000]  # 新增列
df.loc['r1', 'A'] = 99              # 修改单个值

06 DataFrame 常用操作汇总

# 公众号:船长Talk

import pandas as pd

df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'David', None],
    'score': [85, 92, 78, None, 66],
    'city': ['北京', '上海', '北京', '广州', '上海']
})

# ===== 基础查看 =====
df.head(3)       # 前3行
df.tail(2)       # 后2行
df.shape         # (行数, 列数)
df.dtypes        # 每列的数据类型
df.describe()    # 数值列的统计摘要(count/mean/std/min/max等)
df.info()        # 数据集概况(含空值统计)

# ===== 缺失值处理 =====
df.isnull()              # 每个格子是否为NaN
df.isnull().sum()        # 每列NaN数量
df.dropna()              # 删除含NaN的行
df.fillna(0)             # 用0填充NaN
df['score'].fillna(df['score'].mean())  # 用均值填充

# ===== 排序 =====
df.sort_values('score', ascending=False)   # 按score降序
df.sort_values(['city', 'score'])          # 先按city排,再按score排

# ===== 聚合 =====
df.groupby('city')['score'].mean()         # 按城市分组求均值
df.groupby('city').agg({'score': ['mean', 'max', 'count']})  # 多个聚合函数

# ===== 列操作 =====
df['score_grade'] = df['score'].apply(
    lambda x: '优秀' if x >= 90 else ('良好' if x >= 80 else '一般')
)  # apply + lambda 生成新列

# ===== 合并 =====
df1 = pd.DataFrame({'id': [1, 2, 3], 'name': ['A', 'B', 'C']})
df2 = pd.DataFrame({'id': [1, 2, 4], 'score': [85, 92, 78]})
pd.merge(df1, df2, on='id', how='left')   # 左连接(类似SQL LEFT JOIN)
pd.merge(df1, df2, on='id', how='inner')  # 内连接

# ===== 读写文件 =====
df.to_csv('output.csv', index=False, encoding='utf-8-sig')  # 保存CSV
df_read = pd.read_csv('output.csv')                          # 读取CSV
df.to_excel('output.xlsx', index=False)                      # 保存Excel

三、总结:numpy vs pandas 使用场景

场景 推荐用 原因
纯数值矩阵计算 numpy 速度快,矢量化运算
带标签的表格数据 pandas DataFrame方便按列名操作
数据清洗/合并/聚合 pandas groupby/merge/fillna功能完备
机器学习特征工程 两者结合 pandas处理数据,numpy转为模型输入

核心记住一点:pandas 底层就是 numpy,DataFrame的values属性返回的就是numpy数组。两者配合使用,才是数据分析的正确姿势。

📌 本文整理来源

原始笔记来自作者早期 Python 数据分析学习记录,代码均经实际运行验证。

🚢 关注公众号「船长Talk」

每天推送数据分析干货 · Python/SQL实战 · 职场洞察 · AI工具应用

微信搜索「船长Talk」→ 点关注 → 获取更多干货

Logo

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

更多推荐