本文是关于数据分析的两个常用库pandas和numpy的一些基础知识点
一、Numpy基础
Numpy 是 Python 中用于科学计算的基础库
-
导入numpy库
import numpy as np
-
创建数组
# 从列表创建
arr1 = np.array([1, 2, 3, 4])
# 创建全0数组
zeros = np.zeros((3, 4))
# 创建全1数组
ones = np.ones((2, 3))
# 创建单位矩阵
eye = np.eye(3)
# 创建等差数列
arange = np.arange(0, 10, 2) # 0到10,步长2
linspace = np.linspace(0, 1, 5) # 0到1之间5个等分点
# 随机数组
random_arr = np.random.rand(2, 3) # 0-1均匀分布
normal_arr = np.random.randn(2, 3) # 标准正态分布
- 数组属性
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape) # 形状 (2, 3)
print(arr.ndim) # 维度 2
print(arr.size) # 元素总数 6
print(arr.dtype) # 数据类型 int64
- 基本操作
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
# 算术运算
print(a + b) # [5 7 9]
print(a * b) # [4 10 18]
# 矩阵乘法
mat1 = np.array([[1, 2], [3, 4]])
mat2 = np.array([[5, 6], [7, 8]])
print(np.dot(mat1, mat2)) # 或 mat1 @ mat2
# 索引和切片
print(a[1]) # 2
print(arr[0, 1]) # 2 (二维数组)
print(arr[:, 1]) # 第2列 [2 5]
# 布尔索引
mask = a > 1
print(a[mask]) # [2 3]
- 常用函数
# 数学函数
print(np.sqrt(a)) # 平方根
print(np.exp(a)) # 指数
print(np.log(a)) # 自然对数
print(np.abs(-a)) # 绝对值
# 聚合函数
print(np.sum(a)) # 总和
print(np.mean(a)) # 平均值
print(np.std(a)) # 标准差
print(np.max(a)) # 最大值
print(np.argmax(a)) # 最大值索引
# 排序
sorted_arr = np.sort(a)
- NumPy 广播机制
# 广播示例
a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([10, 20, 30])
# b会被广播为与a相同的形状
print(a + b) # 等同于 a + [[10,20,30],[10,20,30]]
二、Pandas 基础
Pandas 是基于 NumPy 的数据分析库,用于数据清洗、处理和分析
提供两种主要数据结构:Series对象(一维)和 DataFrame对象(二维)
-
导入pandas库
import pandas as pd
-
Series
# 创建Series对象
s1 = pd.Series([1, 3, 5, 7])
s2 = pd.Series([1, 3, 5], index=['a', 'b', 'c'])
# 访问数据
print(s1[0]) # 1
print(s2['b']) # 3
# 运算
print(s1 * 2) # 每个元素乘以2
print(s1 + s2) # 对应位置相加(按索引)
- DataFrame
# 创建DataFrame
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['NY', 'LA', 'Chicago']
}
df = pd.DataFrame(data)
# 从CSV创建
# df = pd.read_csv('data.csv')
# 查看数据
print(df.head()) # 前5行
print(df.tail(2)) # 后2行
print(df.shape) # 形状 (3, 3)
print(df.columns) # 列名
print(df.index) # 行索引
# 选择列
print(df['Name']) # 选择Name列
print(df.Age) # 也可以使用点号(列名不含空格时)
# 选择行
print(df.iloc[0]) # 第1行(基于位置)
print(df.loc[0]) # 第1行(基于标签)
print(df[:2]) # 前2行
# 条件选择
mask = df['Age'] > 28
print(df[mask]) # 年龄大于28的行
- 数据操作
# 添加列
df['Salary'] = [70000, 80000, 90000]
# 删除列
df = df.drop('City', axis=1) # axis=1表示列
# 修改数据
df.loc[0, 'Age'] = 26
# 排序
df_sorted = df.sort_values('Age', ascending=False)
# 处理缺失值
df_with_nan = pd.DataFrame({
'A': [1, 2, np.nan],
'B': [5, np.nan, np.nan],
'C': [1, 2, 3]
})
print(df_with_nan.dropna()) # 删除含NaN的行
print(df_with_nan.fillna(0)) # 用0填充NaN
print(df_with_nan.mean()) # 计算均值(自动忽略NaN)
- 常用函数
# 描述性统计
print(df.describe()) # 数值列的统计信息
# 应用函数
def square(x):
return x * x
print(df['Age'].apply(square)) # 对Age列应用平方函数
# 分组聚合
grouped = df.groupby('City')['Age'].mean() # 按City分组计算Age均值
# 合并数据
df1 = pd.DataFrame({'A': ['A0', 'A1'], 'B': ['B0', 'B1']})
df2 = pd.DataFrame({'A': ['A0', 'A2'], 'C': ['C0', 'C2']})
print(pd.merge(df1, df2, on='A')) # 基于A列合并
# 连接
left = pd.DataFrame({'A': ['A0', 'A1'], 'B': ['B0', 'B1']})
right = pd.DataFrame({'C': ['C0', 'C1'], 'D': ['D0', 'D1']})
print(pd.concat([left, right], axis=1)) # 水平连接
- 文件操作
# 读取CSV
df = pd.read_csv('data.csv')
# 读取Excel
# df = pd.read_excel('data.xlsx')
# 写入文件
df.to_csv('output.csv', index=False) # 不写入行索引
# df.to_excel('output.xlsx', index=False)
- Pandas 时间序列
# 创建时间范围
dates = pd.date_range('20230101', periods=6)
df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))
# 重采样
monthly = df.resample('M').mean() # 按月重采样取均值
- 多级索引
# 创建多级索引
arrays = [['A', 'A', 'B', 'B'], [1, 2, 1, 2]]
index = pd.MultiIndex.from_arrays(arrays, names=['first', 'second'])
s = pd.Series(np.random.randn(4), index=index)
# 选择数据
print(s['A']) # 选择first=A的所有数据
print(s[:, 1]) # 选择second=1的所有数据
print(s.xs('A')) # 使用xs选择first=A的数据