Pandas知识点总结:从入门到实战核心功能全掌握
Pandas是基于NumPy构建的开源Python库,专门用于数据分析和处理。它提供了两种主要数据结构:Series(一维带标签数组)和DataFrame(二维表格型数据结构),能够高效处理结构化数据。与直接使用NumPy相比,Patas的主要优势在于:增强数据的可读性,提供清晰的行列标签便捷的数据处理能力丰富的输入输出接口,支持多种文件格式集成时间序列处理功能灵活处理缺失数据安装Panda
高效数据处理,从掌握Pandas开始
Pandas是Python数据分析的核心库,在数据科学、机器学习等领域不可或缺。本文系统总结了Pandas的核心知识点,帮助读者快速掌握这一强大工具。
一、Pandas简介
Pandas是基于NumPy构建的开源Python库,专门用于数据分析和处理。它提供了两种主要数据结构:Series(一维带标签数组)和DataFrame(二维表格型数据结构),能够高效处理结构化数据。
与直接使用NumPy相比,Patas的主要优势在于:
-
增强数据的可读性,提供清晰的行列标签
-
便捷的数据处理能力
-
丰富的输入输出接口,支持多种文件格式
-
集成时间序列处理功能
-
灵活处理缺失数据
安装Pandas的方法很简单,只需执行pip install pandas,使用时通常导入为import pandas as pd。
二、核心数据结构
2.1 Series
Series是Pandas中最基本的一维数据结构,由一组数据及其对应的索引组成。
创建Series的方法:
import pandas as pd
import numpy as np
# 从列表创建
s1 = pd.Series([10, 20, 30, 40])
# 指定索引
s2 = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
# 从字典创建(字典键作为索引)
s3 = pd.Series({'a': 1, 'b': 2, 'c': 3})
# 从NumPy数组创建
s4 = pd.Series(np.random.randn(5))
Series常用属性和方法:
s.values # 获取值数组
s.index # 获取索引
s.mean() # 求平均值
s.sum() # 求和
s.isnull() # 检测缺失值
s.notnull() # 检测非缺失值
s.astype(float) # 转换数据类型
2.2 DataFrame
DataFrame是二维表格型数据结构,可以看作是由Series组成的字典,每个Series为一列,共享同一个索引。
创建DataFrame的常用方法:
# 从字典创建
data = {'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 35],
'城市': ['北京', '上海', '广州']}
df = pd.DataFrame(data)
# 从列表创建
df2 = pd.DataFrame([[1, 2, 3], [4, 5, 6]],
columns=['A', 'B', 'C'])
# 从NumPy数组创建
df3 = pd.DataFrame(np.random.randn(3, 4),
columns=['A', 'B', 'C', 'D'])
# 从文件读取(如CSV)
df4 = pd.read_csv('data.csv')
DataFrame核心属性:
df.shape # 查看形状(行数,列数)
df.index # 行索引
df.columns # 列索引
df.dtypes # 各列数据类型
df.values # 以数组形式返回数据
df.head() # 查看前5行
df.tail() # 查看后5行
df.info() # 数据框基本信息
DataFrame结构示意图
三、数据索引与选择
Pandas提供多种数据索引方法,是数据操作的基础。
3.1 基本索引方法
# 选择单列(返回Series)
df['姓名']
# 选择多列(返回DataFrame)
df[['姓名', '年龄']]
# 使用切片选择行
df[0:3] # 前3行
# 布尔索引
df[df['年龄'] > 25] # 选择年龄大于25的行
df[df['城市'].isin(['北京', '上海'])] # 选择城市为北京或上海的行
3.2 标签选择(loc)和位置选择(iloc)
# loc基于标签选择
df.loc[0, '姓名'] # 选择索引为0、列名为'姓名'的值
df.loc[0:2, ['姓名', '年龄']] # 选择前3行的姓名和年龄列
# iloc基于位置选择(类似NumPy)
df.iloc[0, 1] # 第1行第2列(从0开始)
df.iloc[0:3, 0:2] # 前3行前2列
# 混合选择(ix已弃用,不推荐使用)
3.3 条件过滤
# 多条件筛选
df[(df['年龄'] > 25) & (df['城市'] == '北京')]
# 字符串方法筛选
df[df['姓名'].str.startswith('张')] # 姓张的人
# 查询方法
df.query('年龄 > 25 and 城市 == "北京"')
四、数据清洗与预处理
数据清洗是数据分析的关键步骤,Pandas提供了丰富的数据清洗功能。
4.1 处理缺失值
实际数据中经常存在缺失值,Pandas用NaN表示缺失值。
# 检测缺失值
df.isnull() # 返回布尔DataFrame,缺失值为True
df.isnull().sum() # 每列缺失值数量
# 删除缺失值
df.dropna() # 删除任何包含缺失值的行
df.dropna(axis=1) # 删除任何包含缺失值的列
df.dropna(thresh=3) # 至少包含3个非缺失值才保留
# 填充缺失值
df.fillna(0) # 用0填充
df.fillna(method='ffill') # 用前一个值填充
df.fillna(method='bfill') # 用后一个值填充
df['年龄'].fillna(df['年龄'].mean()) # 用该列均值填充
4.2 处理重复数据
# 检测重复行
df.duplicated() # 返回布尔Series,重复行为True
df.duplicated().sum() # 重复行数量
# 删除重复行
df.drop_duplicates() # 删除完全相同的行
df.drop_duplicates(subset=['姓名']) # 基于姓名列去重
df.drop_duplicates(keep='last') # 保留最后一条重复记录
4.3 数据转换
# 数据类型转换
df['年龄'] = df['年龄'].astype(float) # 转换为浮点数
# 重命名列
df.rename(columns={'旧名': '新名'})
# 替换值
df.replace('北京', '北京市') # 简单替换
df.replace({'北京': '北京市', '上海': '上海市'}) # 字典映射
# 使用map进行转换
df['城市等级'] = df['城市'].map({'北京': 1, '上海': 1, '广州': 2})
# 使用apply应用自定义函数
df['年龄组'] = df['年龄'].apply(lambda x: '青年' if x < 35 else '中年')
五、数据分组与聚合
分组聚合是数据分析中的核心操作,用于对数据进行汇总统计。
5.1 分组操作
# 基本分组
grouped = df.groupby('城市')
# 多列分组
multi_grouped = df.groupby(['城市', '年龄组'])
# 分组后选择特定列
city_group = df.groupby('城市')['年龄']
# 查看分组结果
for name, group in grouped:
print(f"城市: {name}")
print(group)
print("------")
5.2 聚合计算
# 基本聚合函数
df.groupby('城市')['年龄'].mean() # 平均年龄
df.groupby('城市')['年龄'].sum() # 年龄总和
df.groupby('城市')['年龄'].count() # 计数
# 多重聚合
df.groupby('城市')['年龄'].agg(['mean', 'sum', 'count'])
# 不同列不同聚合
df.groupby('城市').agg({'年龄': 'mean', '工资': 'sum'})
# 自定义聚合函数
def max_min_range(x):
return x.max() - x.min()
df.groupby('城市')['年龄'].agg(max_min_range)
5.3 数据透视表
数据透视表是Excel中常见的功能,Pandas也提供了相应实现。
# 简单透视表
pd.pivot_table(df, values='年龄', index='城市', aggfunc='mean')
# 复杂透视表
pd.pivot_table(df,
values='年龄',
index='城市',
columns='性别',
aggfunc=['mean', 'count'],
fill_value=0,
margins=True) # 添加总计行
# 使用pivot进行数据重塑
df.pivot(index='日期', columns='产品', values='销售额')
六、数据合并与连接
实际分析中经常需要将多个数据源合并在一起。
6.1 concat:沿轴方向堆叠
# 纵向堆叠(增加行)
pd.concat([df1, df2], axis=0)
# 横向堆叠(增加列)
pd.concat([df1, df2], axis=1)
# 设置键标识来源
pd.concat([df1, df2], keys=['A', 'B'])
6.2 merge:数据库风格的连接
# 内连接(默认)
pd.merge(df1, df2, on='key')
# 多种连接方式
pd.merge(df1, df2, on='key', how='left') # 左连接
pd.merge(df1, df2, on='key', how='right') # 右连接
pd.merge(df1, df2, on='key', how='outer') # 外连接
# 多键连接
pd.merge(df1, df2, on=['key1', 'key2'])
6.3 join:基于索引的连接
# 基于索引的连接
df1.join(df2, how='left')
# 混合连接(列与索引)
df1.join(df2, on='key')
七、时间序列处理
Pandas具有强大的时间序列处理能力,适用于金融、气象等领域。
7.1 时间对象转换
# 字符串转时间
pd.to_datetime('2023-01-01')
pd.to_datetime(['2023-01-01', '2023-01-02'])
# 设置时间索引
df['时间'] = pd.to_datetime(df['时间列'])
df.set_index('时间', inplace=True)
7.2 时间序列操作
# 生成时间范围
pd.date_range('2023-01-01', periods=10, freq='D') # 天
pd.date_range('2023-01-01', periods=10, freq='H') # 小时
# 重采样(降采样)
df.resample('W').mean() # 按周重采样求平均
# 重采样(升采样)
df.resample('6H').ffill() # 6小时频率,前向填充
# 移动窗口计算
df.rolling(window=7).mean() # 7天移动平均
八、数据可视化
Pandas集成了Matplotlib,可以快速实现数据可视化。
8.1 基本绘图
import matplotlib.pyplot as plt
# 折线图
df['销售额'].plot(kind='line', title='销售额趋势')
plt.show()
# 柱状图
df.groupby('城市')['年龄'].mean().plot(kind='bar')
plt.show()
# 直方图
df['年龄'].plot(kind='hist', bins=20)
plt.show()
# 散点图
df.plot(kind='scatter', x='年龄', y='工资')
plt.show()
# 饼图
df['城市'].value_counts().plot(kind='pie', autopct='%1.1f%%')
plt.show()
8.2 多子图绘制
# 创建子图
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
df['年龄'].plot.hist(ax=axes[0,0], title='年龄分布')
df.groupby('城市')['工资'].mean().plot.bar(ax=axes[0,1], title='各城市平均工资')
df['工资'].plot.box(ax=axes[1,0], title='工资箱线图')
df.plot.scatter(x='年龄', y='工资', ax=axes[1,1], title='年龄-工资散点图')
plt.tight_layout()
plt.show()
九、文件读写
Pandas支持多种文件格式的读写。
9.1 常见文件格式
# CSV文件
df.to_csv('output.csv', index=False) # 写入CSV
df = pd.read_csv('input.csv') # 读取CSV
# Excel文件
df.to_excel('output.xlsx', sheet_name='Sheet1', index=False)
df = pd.read_excel('input.xlsx', sheet_name='Sheet1')
# 其他格式
df.to_json('data.json') # JSON格式
df.to_sql('table', con) # 数据库
9.2 读取参数设置
# 读取CSV时的常用参数
df = pd.read_csv('data.csv',
encoding='utf-8', # 编码格式
sep=',', # 分隔符
header=0, # 列名所在行
index_col=0, # 索引列
parse_dates=['日期'], # 解析日期列
na_values=['NULL', 'N/A']) # 缺失值标识
十、性能优化技巧
处理大数据集时,性能优化很重要。
10.1 数据类型优化
# 查看数据类型
df.dtypes
# 优化数据类型减少内存占用
df['整数列'] = df['整数列'].astype('int32') # 默认int64
df['小数列'] = df['小数列'].astype('float32') # 默认float64
df['字符串列'] = df['字符串列'].astype('category') # 分类数据
10.2 大规模数据处理
# 分块读取大文件
chunk_iter = pd.read_csv('large_file.csv', chunksize=10000)
for chunk in chunk_iter:
process(chunk) # 处理每个块
# 使用高效数据类型
dtypes = {'列1': 'category', '列2': 'float32'}
df = pd.read_csv('large_file.csv', dtype=dtypes)
实战案例:销售数据分析
以下是一个简单的实战案例,展示Pandas的综合应用。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 创建示例数据
np.random.seed(42)
dates = pd.date_range('2023-01-01', periods=100, freq='D')
data = {
'日期': dates,
'产品': np.random.choice(['A', 'B', 'C'], 100),
'销售额': np.random.randint(100, 1000, 100),
'数量': np.random.randint(1, 20, 100)
}
df = pd.DataFrame(data)
df.set_index('日期', inplace=True)
# 数据分析
print("基本统计信息:")
print(df.describe())
print("\n各产品总销售额:")
product_sales = df.groupby('产品')['销售额'].sum()
print(product_sales)
# 可视化
plt.figure(figsize=(12, 6))
df.groupby('产品')['销售额'].plot(kind='hist', alpha=0.5, legend=True)
plt.title('各产品销售额分布')
plt.xlabel('销售额')
plt.legend(['产品A', '产品B', '产品C'])
plt.show()
# 时间序列分析
weekly_sales = df['销售额'].resample('W').sum()
weekly_sales.plot(kind='line', title='周销售额趋势')
plt.show()
总结
本文系统总结了Pandas的核心功能,包括:
-
两种核心数据结构:Series和DataFrame
-
数据索引与选择:loc、iloc、布尔索引等
-
数据清洗:处理缺失值、重复值、数据转换
-
数据分组与聚合:groupby、聚合函数、数据透视表
-
数据合并:concat、merge、join
-
时间序列处理:时间转换、重采样、移动窗口
-
数据可视化:集成Matplotlib绘图
-
文件读写:支持多种格式的输入输出
-
性能优化:数据类型优化、分块处理
掌握这些知识点,能够应对大部分数据分析任务。Pandas的功能远不止于此,建议在实际项目中不断探索更多高级功能。
学习建议:多动手实践,结合实际项目需求学习,逐步掌握Pandas的强大功能。官方文档是最好的参考资料,遇到问题时可以参考。
希望本文对你的Pandas学习有所帮助!欢迎在评论区留言交流。
更多推荐



所有评论(0)