文章目录
-
- [1. Series 与 DataFrame](#1. Series 与 DataFrame)
- [2. 数据查看与基本信息获取](#2. 数据查看与基本信息获取)
- [3. 数据选择与筛选](#3. 数据选择与筛选)
- [4. 数据清洗与预处理](#4. 数据清洗与预处理)
- [5. 数据排序与重置索引](#5. 数据排序与重置索引)
- [6. 数据分组与聚合分析](#6. 数据分组与聚合分析)
- [7. 数据合并](#7. 数据合并)
1. Series 与 DataFrame
Series:一维带标签数组,类似于 Excel 中的单列数据
python
import pandas as pd
import numpy as np
# 创建 Series 的几种方式
s1 = pd.Series([10, 20, 30, 40]) # 默认整数索引
s2 = pd.Series([100, 200, 300], index=['a', 'b', 'c']) # 自定义标签索引
s3 = pd.Series({'北京': 2154, '上海': 2428, '广州': 1867}) # 从字典创建
DataFrame:二维表格型数据结构,是数据分析的主要载体
python
# 创建 DataFrame
df = pd.DataFrame({
'姓名': ['张三', '李四', '王五', '赵六'],
'年龄': [25, 30, 35, 28],
'城市': ['北京', '上海', '广州', '深圳'],
'工资': [8000, 12000, 15000, 10000]
})
# 从文件读取数据(最常用)
df_csv = pd.read_csv('data.csv') # 读取 CSV 文件
df_excel = pd.read_excel('data.xlsx') # 读取 Excel 文件
df_json = pd.read_json('data.json') # 读取 JSON 文件
2. 数据查看与基本信息获取
Pandas 提供了多种快速查看数据的方法。
python
# 查看数据前几行和后几行
df.head(3) # 查看前3行,默认5行
df.tail(2) # 查看后2行,默认5行
df.sample(3) # 随机查看3行,了解数据分布
# 获取数据基本信息
print(f"数据形状: {df.shape}") # 输出 (行数, 列数)
print(f"数据维度: {df.ndim}") # 维度数(DataFrame为2)
# 查看数据类型和内存信息
df.info() # 显示各列数据类型、非空值数量和内存使用
df.dtypes # 只查看各列数据类型
df.memory_usage() # 查看各列内存使用情况
# 数值型数据的统计摘要
df.describe() # 显示计数、均值、标准差、最小值、四分位数、最大值
df.describe(include='all') # 包含所有类型列的统计
3. 数据选择与筛选
选择列数据:
python
# 选择单列 - 返回 Series
年龄列 = df['年龄']
# 选择多列 - 返回 DataFrame
姓名年龄 = df[['姓名', '年龄']]
# 使用点表示法(列名需符合变量命名规则)
df.年龄 # 等价于 df['年龄']
选择行数据:
python
# 按标签选择(loc) - 使用索引标签
df.loc[0] # 选择索引为0的行
df.loc[0:2] # 选择索引0到2的行(包含2)
df.loc[[0, 2, 3]] # 选择索引为0,2,3的行
# 按位置选择(iloc) - 使用整数位置
df.iloc[0] # 选择第0行(从0开始计数)
df.iloc[0:3] # 选择第0到2行(不包含3)
df.iloc[[0, 2]] # 选择第0和第2行
# 布尔索引(条件筛选)
df[df['年龄'] > 30] # 年龄大于30的行
df[(df['年龄'] > 25) & (df['工资'] < 12000)] # 多条件筛选
df[df['城市'].isin(['北京', '上海'])] # 城市在北京或上海
df[~df['城市'].isin(['广州'])] # 城市不是广州(~表示取反)
4. 数据清洗与预处理
数据清洗用来在数据分析中确保数据质量。
处理缺失值:
python
# 检测缺失值
df.isnull() # 返回布尔DataFrame,显示每个单元格是否为空
df.isnull().sum() # 统计每列缺失值数量
df.isnull().any() # 检查每列是否有缺失值
# 处理缺失值
df.dropna() # 删除包含任何缺失值的行
df.dropna(axis=1) # 删除包含任何缺失值的列
df.dropna(subset=['年龄', '工资']) # 只删除指定列有缺失值的行
df.fillna(0) # 用0填充所有缺失值
df.fillna({'年龄': df['年龄'].mean()}) # 年龄列用平均值填充
df.fillna(method='ffill') # 用前一个有效值填充(前向填充)
df.fillna(method='bfill') # 用后一个有效值填充(后向填充)
# 插值填充
df.interpolate() # 线性插值填充
处理重复数据:
python
# 检测重复行
df.duplicated() # 标记重复行(除第一次出现外)
df.duplicated().sum() # 统计重复行数量
# 删除重复行
df.drop_duplicates() # 删除完全重复的行
df.drop_duplicates(subset=['姓名']) # 基于姓名列删除重复
df.drop_duplicates(subset=['姓名'], keep='last') # 保留最后一次出现
数据类型转换:
python
# 转换数据类型
df['年龄'] = df['年龄'].astype('int32') # 转换为32位整数
df['工资'] = df['工资'].astype('float64') # 转换为双精度浮点数
df['入职日期'] = pd.to_datetime(df['入职日期']) # 转换为日期时间
# 重命名列
df.rename(columns={'旧列名': '新列名'}, inplace=True) # 重命名单个列
df.rename(columns={'姓名': '员工姓名', '年龄': '员工年龄'}, inplace=True) # 重命名多个列
df.columns = ['列1', '列2', '列3'] # 重命名所有列
5. 数据排序与重置索引
排序和索引操作用来对数据进行组织和整理。
python
# 按值排序
df.sort_values('年龄') # 按年龄升序排序
df.sort_values('年龄', ascending=False) # 按年龄降序排序
df.sort_values(['城市', '年龄']) # 先按城市排序,再按年龄排序
df.sort_values(['城市', '年龄'], ascending=[True, False]) # 城市升序,年龄降序
# 按索引排序
df.sort_index() # 按索引升序排序
df.sort_index(ascending=False) # 按索引降序排序
# 重置索引
df.reset_index() # 将索引转换为列,新建默认整数索引
df.reset_index(drop=True) # 直接重置为整数索引,不保留原索引
df.reset_index(drop=True, inplace=True) # 原地修改,不创建新对象
6. 数据分组与聚合分析
分组聚合是数据分析的核心,用于计算分组统计量。
python
# 基本分组操作
按城市分组 = df.groupby('城市') # 按城市分组
按城市分组.groups # 查看分组结果
按城市分组.size() # 查看每组大小
# 单列聚合
df.groupby('城市')['工资'].mean() # 按城市计算平均工资
df.groupby('城市')['工资'].sum() # 按城市计算工资总和
df.groupby('城市')['年龄'].max() # 按城市计算最大年龄
df.groupby('城市')['年龄'].min() # 按城市计算最小年龄
df.groupby('城市')['姓名'].count() # 按城市统计人数
# 多列聚合
df.groupby('城市').agg({
'年龄': ['mean', 'min', 'max'],
'工资': ['sum', 'mean', 'std']
})
# 命名聚合结果
df.groupby('城市').agg(
平均年龄=('年龄', 'mean'),
最高工资=('工资', 'max'),
人数=('姓名', 'count')
)
# 多级分组
df.groupby(['城市', '年龄']).mean() # 按城市和年龄两级分组
7. 数据合并
在实际项目中,数据往往来自多个源,需要合并处理。
纵向合并(添加行):
python
# 简单合并(要求列相同)
df_all = pd.concat([df1, df2, df3]) # 默认纵向合并
df_all = pd.concat([df1, df2], ignore_index=True) # 忽略原索引,创建新索引
# 处理不同列的情况
df_all = pd.concat([df1, df2], sort=False) # 保留所有列,缺失值填充NaN
横向合并(添加列):
python
# 简单横向合并(要求行数相同)
df_combined = pd.concat([df1, df2], axis=1)