Pandas基础:AI数据处理的必备技能
摘要 Pandas是Python中强大的数据处理库,广泛应用于人工智能和机器学习领域。它提供两种核心数据结构:Series(一维)和DataFrame(二维),支持数据清洗、筛选、排序、聚合等操作。Pandas常用于数据导入、缺失值处理、特征工程等机器学习准备阶段,并能与NumPy等库无缝衔接。其多层索引、分组聚合、自定义计算等功能,使其成为AI工作流中不可或缺的工具,为模型训练提供高质量数据基础
pandas基础
导入库:import pandas as pd , pandas:数据处理库,常用别名是 pd
import numpy as np , numpy:数值计算库,常用别名是 np。
1.为什么?
在人工智能和机器学习中,数据是燃料。
而 Pandas 是处理数据最强大的 Python 工具之一。
- 它能让你像在 Excel 一样操作数据(表格、行列、筛选、计算)。
- 它是 机器学习前的数据准备工具 —— 几乎所有模型训练前都要用 Pandas 清洗、整理数据。
在 AI 工作流中,顺序通常是:
数据收集 → 数据清洗(Pandas) → 特征工程 → 模型训练(Sklearn、PyTorch、TensorFlow)
2.是什么?
基于Numpy的高级数据分析库,提供了两种主要数据结构:
| 结构 | 维度 | 类似的概念 | 说明 |
|---|---|---|---|
| Series | 一维 | 列表 / Excel的一列 | 每个数据都有一个索引 |
| DataFrame | 二维 | Excel表 / 数据表 | 由多个Series按列组成 |
3.核心结构
3.1 series
import pandas as pd
# 创建一个 Series
series = pd.Series([10, 20, 30, 40], index=['a', 'b', 'c', 'd'])
print(series)
a 10
b 20
c 30
d 40
dtype: int64
# 按索引取值
print(series['b']) # 20
# 增加数据
series['e'] = 50
# 删除数据
series = series.drop('a')
# 修改数据
series['b'] = 99
# 重排索引
series = series.reindex(['e', 'd', 'c', 'b'])
3.2 DataFrame
data = {
'姓名': ['小王', '小李', '小张'],
'成绩': [90, 85, 88],
'性别': ['男', '女', '男']
}
df = pd.DataFrame(data, index=['一班', '二班', '三班']) #行索引
print(df)
#获取
df.head() #查看前几行
df['成绩']
df.loc['一班']
df.loc[['一班','三班'],['姓名', '成绩']] #指定行列
df.iloc[[0,2],[0,1]] #按位置取
# 添加列
df['班级'] = ['一班', '二班', '三班']
# 删除列
df = df.drop('性别', axis=1)
# 修改列
df['成绩'] = [95, 88, 92]
df.sort_index() # 按行索引排序
df.sort_values('成绩') # 按列值排序
4.层次化索引
允许在一个轴向上有多个索引级别。
4.1创建
方法1:使用MultiIndex.from_arrays(如示例)
import pandas as pd
arrays = [
['北京', '北京', '上海', '上海'], # 第一级索引
['2023', '2024', '2023', '2024'] # 第二级索引
]
index = pd.MultiIndex.from_arrays(arrays, names=('城市', '年份'))
data = pd.Series([80, 85, 88, 90], indexindex)
方法2:使用元组列表
index = pd.MultiIndex.from_tuples([
('北京', '2023'),
('北京', '2024'),
('上海', '2023'),
('上海', '2024')
], names=('城市', '年份'))
方法3:直接创建DataFrame
df = pd.DataFrame({
'城市': ['北京', '北京', '上海', '上海'],
'年份': ['2023', '2024', '2023', '2024'],
'数据': [80, 85, 88, 90]
}).set_index(['城市', '年份'])
城市 年份
北京 2023 80
2024 85
上海 2023 88
2024 90
dtype: int64
data['北京'] # 筛出北京的所有年份数据
data['北京']['2023'] # 筛出北京2023年的数据
5.pandas与人工智能的关系
| 阶段 | 作用 |
|---|---|
| 数据导入 | 从 CSV、Excel、SQL 等读取原始数据 |
| 数据清洗 | 删除空值、处理重复、替换缺失值 |
| 特征工程 | 提取、组合、标准化数据特征 |
| 模型训练前准备 | 将清洗好的数据转成 NumPy 数组或张量输入机器学习模型 |
6 示例
avg = df['成绩'].mean
top = df.loc[df['成绩'].idxmax(),'姓名']
gender_avg = df.groupby('性别')['成绩'].mean()
df['是否及格'] = df['成绩'] >= 60
7 数据操作与清洗
1️⃣ 缺失值处理
人工智能中的数据经常“不完整”——Pandas 提供了自动处理方法。
import numpy as np
df.loc[1, 'Age'] = None
df.loc[2, 'Salary'] = np.nan
df.fillna({'Age': df['Age'].mean(), 'Salary': df['Salary'].median()}, inplace=True)
📘 常见策略:
dropna()删除缺失数据df.fillna(0)- 用0填充df.fillna(method='ffill')- 用前一个值填充df.fillna(df.mean())- 用各列均值填充
2️⃣ 数据筛选
# 逻辑条件筛选
df[df['Age'] > 30]
# 多条件筛选
df[(df['Age'] > 25) & (df['Salary'] > 6000)]
3️⃣ 数据排序
df.sort_values('Salary', ascending=False) # 按薪资降序
df.sort_index() # 按索引排序
4️⃣ 数据分组与聚合
df.groupby('City').agg({'Age': 'mean', 'Salary': 'sum'})
📘 常用聚合函数:
mean()平均值sum()总和count()计数max()、min()最大/最小
5️⃣ 处理重复与唯一值
df.drop_duplicates(subset='Name') #指定列删除重复行,保留第一个出现的
df['City'].unique() # 去重,返回指定列的所有唯一值
df['City'].value_counts() # 统计数量
常用参数:df.drop_duplicates
subset:指定判断重复的列,可以是单列或多列keep:保留哪个重复项,'first'(默认)/'last'/False(全部删除)inplace:是否原地修改,True/False
特点:df[‘city’].unique()
- 返回numpy数组
- 不包含重复值
- 保持原始顺序(按第一次出现的顺序)
常用参数:df[‘city’].value_counts()
normalize:是否返回比例而非计数,True返回频率ascending:是否升序排列,False(默认降序)/Truedropna:是否排除NaN值,True(默认)/False
8 数据变换与高级操作
1️⃣ apply() 函数 —— 自定义计算
def bonus_calc(salary):
return salary *0.1 if salary > 5000 else 0
df['Bonus'] = df['Salary'].apply(bonus_calc)
输出:
Name Salary Bonus
0 Alice 4000 0
1 Bob 6000 600
2 Charlie 8000 800
2️⃣ eval() 表达式计算——字符串表达式进行列运算(性能好)
# 使用eval计算
df.eval('Total = Salary + Bonus', inplace=True)
df.eval('Tax = Total * 0.1', inplace=True)
print(df)
输出:
Salary Bonus Total Tax
0 4000 0 4000 400
1 6000 600 6600 660
2 8000 800 8800 880
3️⃣ 窗口函数(rolling)——对滑动窗口的数据进行计算,常用于时间序列
# 创建时间序列数据
dates = pd.date_range('2024-01-01', periods=6)
df = pd.DataFrame({
'Date': dates,
'Salary': [1000, 2000, 3000, 4000, 5000, 6000]
})
# 计算2期移动平均
df['Salary_MA'] = df['Salary'].rolling(window=2).mean()
print(df)
输出:
Date Salary Salary_MA
0 2024-01-01 1000 NaN
1 2024-01-02 2000 1500.0
2 2024-01-03 3000 2500.0
3 2024-01-04 4000 3500.0
4 2024-01-05 5000 4500.0
5 2024-01-06 6000 5500.0
5️⃣ 数据堆叠与解堆——列转换成行索引
# 创建示例数据
df = pd.DataFrame({
'City': ['Beijing', 'Beijing', 'Shanghai', 'Shanghai'],
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Salary': [5000, 6000, 7000, 8000],
'Bonus': [500, 600, 700, 800]
})
# 堆叠:将列转换为行索引
stacked = df.set_index(['city','Name']).stack()
print("堆叠后的数据:")
print(stacked)
shuchu:
City Name
Beijing Alice Salary 5000
Bonus 500
Bob Salary 6000
Bonus 600
Shanghai Charlie Salary 7000
Bonus 700
David Salary 8000
Bonus 800
dtype: int64
# 解堆:将行索引转换回列
unstacked = stacked.unstack()
print("\n解堆后的数据:")
print(unstacked)
输出:
City Name Bonus Salary
Beijing Alice 500 5000
Bob 600 6000
Shanghai Charlie 700 7000
David 800 8000
9 数据统计与探索
1️⃣ 描述性统计
df.describe()
输出均值、标准差std()、最小值、分位数、最大值等。
2️⃣ 分箱与离散化
# 按年龄分段
bins = [20, 30, 40, 50]
labels = ['20-29', '30-39', '40-49']
df['AgeGroup'] = pd.cut(df['Age'],bins=bins,labels=labels)
# 按分位数分薪资等级
df['SalaryQuantile'] = pd.qcut(df['Salary'], q=4, labels=['低', '中低', '中高', '高'])
10 数据可视化
import matplotlib.pyplot as plt
df.plot(x='Name', y='Salary', kind='bar', title='Salary by Name')
plt.show()
常见图形:
| 类型 | kind参数 | 说明 |
|---|---|---|
| 折线图 | 'line' |
变化趋势 |
| 柱状图 | 'bar' |
类别比较 |
| 直方图 | 'hist' |
分布情况 |
| 散点图 | 'scatter' |
相关性分析 |
11 pandas与人工智能的结合
📘 AI 前置处理常见任务:
| 任务 | Pandas 操作 | 目标 |
|---|---|---|
| 缺失值填充 | fillna() |
避免模型错误输入 |
| 特征选择 | df[['特征1','特征2']] |
提取关键属性 |
| 特征编码 | pd.get_dummies() |
将分类变量转为数值 |
| 特征标准化 | (x - x.min())/(x.max()-x.min()) |
数据范围归一化 |
| 数据集划分 | df.sample(frac=0.8) |
训练/测试划分 |
- **特征编码
pd.get_dummies()**df = pd.DataFrame({ '城市': ['北京', '上海', '广州', '北京', '深圳'], '学历': ['本科', '硕士', '博士', '本科', '硕士'], '工资': [5000, 6000, 7000, 5500, 6500] }) print("原始数据:") print(df) # 对分类变量进行独热编码 df_encoded = pd.get_dummies(df, columns=['城市', '学历']) print("\n编码后数据:") print(df_encoded)输出:
工资 城市_北京 城市_上海 城市_广州 城市_深圳 学历_本科 学历_硕士 学历_博士 0 5000 1 0 0 0 1 0 0 1 6000 0 1 0 0 0 1 0 2 7000 0 0 1 0 0 0 1 3 5500 1 0 0 0 1 0 0 4 6500 0 0 0 1 0 1 0
- 特征标准化:将数值特征缩放到相同范围,避免某些特征因数值过大而主导模型
# 最小-最大标准化(归一化) df = pd.DataFrame({ '年龄': [20, 35, 50, 25, 40], '工资': [3000, 8000, 15000, 5000, 10000], '购买金额': [100, 500, 1000, 200, 800] }) print("原始数据:") print(df) # 最小-最大标准化 df_normalized = df.copy() for col in ['年龄', '工资', '购买金额']: df_normalized[col] = (df[col] - df[col].min()) / (df[col].max() - df[col].min()) print("\n标准化后数据:") print(df_normalized)# 方法1:最小-最大标准化(归一化) def 归一化(列): return (列 - 列.min()) / (列.max() - 列.min()) 标准化成绩表 = 成绩表.copy() for 科目 in ['语文', '数学', '英语']: 标准化成绩表[科目] = 归一化(成绩表[科目])其他标准化方法:
# Z-score标准化 df_zscore = df.copy() for col in ['年龄', '工资', '购买金额']: df_zscore[col] = (df[col] - df[col].mean()) / df[col].std() #(值-平均值)/标准差
- **数据集划分
df.sample(frac=0.8)**目标:将数据划分为训练集和测试集,用于模型训练和评估
# 创建100个学生的完整数据集 np.random.seed(42) # 确保每次运行得到相同结果,便于教学 学习数据 = pd.DataFrame({ '学习时间': np.random.normal(5, 2, 100), # 正态分布,均值5,标准差2 '做题数量': np.random.normal(50, 20, 100), # 正态分布,均值50,标准差20 '考试分数': np.random.randint(60, 100, 100) # 均匀分布,60-100分 }) print("🎓 100个学生的学习数据概况:") print(f"数据集形状: {学习数据.shape}") # (100, 3) print("\n前5个学生数据:") print(学习数据.head()) # 方法1:手动划分 print("\n📦 方法1: 手动划分数据集") 复习资料 = 学习数据.sample(frac=0.8, random_state=42) # 随机抽取80% 模拟试卷 = 学习数据.drop(复习资料.index) # 剩下的20% print(f"📚 复习资料: {len(复习资料)} 个学生") print(f"📝 模拟试卷: {len(模拟试卷)} 个学生") # 方法2:使用sklearn(更专业) print("\n🔧 方法2: 使用sklearn划分") from sklearn.model_selection import train_test_split # 分离特征(X)和目标变量(y) X = 学习数据[['学习时间', '做题数量']] # 特征:学习时间和做题数量 y = 学习数据['考试分数'] # 目标:要预测的考试分数 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, # 测试集比例20% random_state=42 # 随机种子,确保可重复 ) print(f"特征训练集: {X_train.shape}") print(f"特征测试集: {X_test.shape}") print(f"目标训练集: {y_train.shape}") print(f"目标测试集: {y_test.shape}")最终输出:
🎓 100个学生的学习数据概况: 数据集形状: (100, 3) 前5个学生数据: 学习时间 做题数量 考试分数 0 6.483369 59.881468 95 1 4.676542 47.383437 84 2 6.295149 45.825345 89 3 4.204893 45.817836 97 4 5.440972 70.405199 90 📦 方法1: 手动划分数据集 📚 复习资料: 80 个学生 📝 模拟试卷: 20 个学生 🔧 方法2: 使用sklearn划分 特征训练集: (80, 2) 特征测试集: (20, 2) 目标训练集: (80,) 目标测试集: (20,)
更多推荐


所有评论(0)