第3章:Python数据科学基础
说实话,很多初学者一上来就急着跑模型,结果连数据都读不进去。我见过太多这样的案例了。数据科学的基础,说白了就是三板斧:NumPy做数值计算,Pandas处理表格数据,再加上文件读写。这三样玩熟了,后面建模才能顺手。
3.1 NumPy数组操作
NumPy是Python科学计算的基石。我刚开始做数据分析时,用的还是Python原生的列表,后来发现处理百万级数据时慢得让人抓狂。NumPy的数组操作,底层是用C语言实现的,速度能快几十倍。
创建数组
import numpy as np
# 从列表创建
arr1 = np.array([1, 2, 3, 4, 5])
# 创建全零数组
zeros = np.zeros((3, 4))
# 创建等差数列
seq = np.arange(0, 10, 2) # [0, 2, 4, 6, 8]
# 创建随机数组
rand = np.random.randn(3, 3) # 标准正态分布
嗯,这里要注意:np.array()和Python列表最大的区别是什么?数组要求所有元素类型一致。我曾经在项目中用列表存了混合类型的数据,结果跑模型时报错,排查了半天才发现是类型问题。
数组形状操作
| 方法 | 作用 | 示例 |
|---|---|---|
| reshape | 改变形状 | arr.reshape(2, 5) |
| flatten | 展平为一维 | arr.flatten() |
| transpose | 转置 | arr.T |
| concatenate | 拼接 | np.concatenate([a, b]) |
我的小技巧:reshape时如果某个维度不确定,可以用-1占位。比如arr.reshape(-1, 4),NumPy会自动计算行数。这个在特征工程中特别实用。
向量化运算
这是NumPy最强大的特性。你想想看,如果用Python循环计算100万个数的平方,得等到什么时候?但NumPy一行搞定:
data = np.random.randn(1000000)
squared = data ** 2 # 向量化运算,瞬间完成
# 条件筛选
mask = data > 0
positive = data[mask] # 布尔索引
避坑指南:我曾经在项目中直接用==比较两个浮点数数组,结果因为精度问题导致结果全错。浮点数比较要用np.isclose(),切记!
3.2 Pandas数据结构
Pandas是Python数据分析的瑞士军刀。我个人习惯,拿到任何数据第一步就是用Pandas读进来看看。它有两个核心数据结构:Series和DataFrame。
Series:一维数据
Series说白了就是带标签的一维数组。每个元素都有索引,你可以用位置访问,也可以用标签访问。
import pandas as pd
# 创建Series
s = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
# 访问数据
print(s['b']) # 20,用标签
print(s[1]) # 20,用位置
# 向量化操作
s2 = s * 2 + 1
DataFrame:二维表格
DataFrame是Pandas的核心。它就像一个Excel表格,有行索引和列名。我处理过的数据,90%以上都是用DataFrame来操作的。
# 从字典创建
data = {
'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 28],
'薪资': [15000, 20000, 18000]
}
df = pd.DataFrame(data)
# 查看数据
print(df.head()) # 前5行
print(df.info()) # 数据类型和缺失值
print(df.describe()) # 统计摘要
核心操作:
- 选择列:
df['年龄']或df.年龄 - 选择行:
df.loc[0](标签)或df.iloc[0](位置) - 条件筛选:
df[df['年龄'] > 25] - 分组聚合:
df.groupby('部门')['薪资'].mean()
3.3 数据读取与写入
实际项目中,数据很少直接写在代码里。都是从文件读进来的。我常用的几种格式:
CSV文件
# 读取
df = pd.read_csv('data.csv', encoding='utf-8')
# 写入
df.to_csv('output.csv', index=False) # index=False 不保存行索引
经验之谈:读CSV时经常遇到编码问题。我一般先试utf-8,不行就换gbk或latin1。另外,parse_dates参数可以自动解析日期列,省得后面再转换。
Excel文件
# 读取
df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
# 写入多个sheet
with pd.ExcelWriter('output.xlsx') as writer:
df1.to_excel(writer, sheet_name='训练集')
df2.to_excel(writer, sheet_name='测试集')
其他格式
| 格式 | 读取 | 写入 | 适用场景 |
|---|---|---|---|
| JSON | pd.read_json() | df.to_json() | API数据 |
| Parquet | pd.read_parquet() | df.to_parquet() | 大数据量,压缩率高 |
| SQL | pd.read_sql() | df.to_sql() | 数据库交互 |
注意:读取大文件时,可以用chunksize参数分块读取。我曾经一次性读了个5GB的CSV,内存直接爆了。后来改成逐块处理,问题就解决了。
知识体系总览
下面这张图,是我梳理的本章知识脉络。你看一眼,心里就有谱了:
这张图把本章的核心内容串起来了。NumPy负责底层数值计算,Pandas负责数据组织和操作,文件读写负责数据进出。三者配合,就是数据科学的基本功。
我个人建议,初学者先把Pandas的DataFrame操作练熟。因为实际项目中,80%的时间都在和数据框打交道。NumPy的向量化运算也要掌握,这在特征工程中能省下大量时间。