【Python】Pandas库:开源数据分析工具的卓越性能与功能
文章目录
Pandas 库 是 Python 中一个强大的开源 数据分析工具,专注于处理结构化数据(如表格、时间序列等)。它基于 NumPy 构建,提供了高效的数据操作能力,是数据科学领域的核心工具之一。
以下是关于
Pandas 库 的全面详解,涵盖核心概念、功能、操作技巧及实际应用场景:
一、Pandas 核心数据结构
Pandas 的两种核心数据结构是 Series 和 DataFrame,均基于 NumPy 数组 构建,支持高效计算。
1. Series
0,1,2,...
)或手动指定。import pandas as pd
s = pd.Series([10, 20, 30], index=['a', 'b', 'c'])
print(s['b']) # 输出 20
2. DataFrame
data = {
'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Paris', 'London']
}
df = pd.DataFrame(data, index=['id1', 'id2', 'id3'])
print(df)
输出:
Name Age City
id1 Alice 25 New York
id2 Bob 30 Paris
id3 Charlie 35 London
二、数据输入与输出
Pandas 支持多种数据格式的读写:
1. 常见格式
格式 | 读取函数 | 写入函数 |
---|---|---|
CSV | pd.read_csv() |
df.to_csv() |
Excel | pd.read_excel() |
df.to_excel() |
SQL | pd.read_sql() |
df.to_sql() |
JSON | pd.read_json() |
df.to_json() |
HTML | pd.read_html() |
df.to_html() |
2. 示例
# 读取 CSV 文件,指定分隔符和编码
df = pd.read_csv('data.csv', sep=',', encoding='utf-8')
# 写入 Excel 文件,忽略索引
df.to_excel('output.xlsx', index=False)
三、数据清洗与预处理
数据清洗是数据分析的关键步骤,Pandas 提供丰富的工具:
1. 处理缺失值
df.isnull() # 返回布尔矩阵
df.isnull().sum() # 每列缺失值数量
df.dropna() # 删除含缺失值的行
df.fillna(0) # 填充为固定值
df.fillna(method='ffill') # 用前一个非缺失值填充(前向填充)
df.interpolate() # 插值填充(如线性插值)
2. 去重
df.drop_duplicates(subset=['列名'], keep='first') # 根据指定列去重
3. 数据类型转换
df['Age'] = df['Age'].astype(int) # 转为整数
df['Date'] = pd.to_datetime(df['Date']) # 转为日期类型
df['Category'] = df['Category'].astype('category') # 分类类型节省内存
四、数据筛选与操作
1. 选择列
df['Name'] # 返回 Series
df[['Name', 'Age']] # 返回 DataFrame
2. 选择行
df.iloc[0] # 第 0 行
df.iloc[1:3] # 第 1 到 2 行(左闭右开)
df.loc['id1'] # 索引为 'id1' 的行
df.loc[df['Age'] > 25] # 筛选年龄大于 25 的行
3. 条件筛选
# 多条件组合(使用 &, |, ~)
df[(df['Age'] > 25) & (df['City'] == 'Paris')]
4. 新增列
df['Birth Year'] = 2023 - df['Age'] # 计算出生年份
df['High Age'] = df['Age'].apply(lambda x: 'Yes' if x > 30 else 'No') # 应用函数
五、数据聚合与统计
1. 描述性统计
df.describe() # 数值列的统计摘要(均值、标准差、分位数等)
df['Age'].mean() # 平均年龄
df.corr() # 列之间的相关系数矩阵
2. 分组聚合
# 按城市分组,计算平均年龄和最大年龄
grouped = df.groupby('City').agg({
'Age': ['mean', 'max'],
'Name': 'count'
})
3. 透视表
# 生成按城市和年龄分组的透视表
pivot_table = df.pivot_table(index='City', columns='Age', values='Name', aggfunc='count')
六、数据合并与重塑
1. 合并数据
pd.concat([df1, df2], axis=0) # 垂直拼接(增加行)
pd.concat([df1, df2], axis=1) # 水平拼接(增加列)
pd.merge(df1, df2, on='key', how='inner') # 内连接
2. 重塑数据
pd.melt(df, id_vars=['Name'], value_vars=['Age', 'City'])
df.pivot(index='Name', columns='City', values='Age')
七、时间序列处理
Pandas 对时间序列的支持尤为强大:
1. 时间解析
df['Date'] = pd.to_datetime(df['Date'], format='%Y-%m-%d')
2. 时间索引
df.set_index('Date', inplace=True) # 将日期设为索引
df.resample('M').mean() # 按月重采样计算均值
3. 时间窗口计算
df['Rolling Mean'] = df['Price'].rolling(window=7).mean() # 7 天滚动均值
八、高效操作与性能优化
1. 避免循环,使用向量化操作
for index, row in df.iterrows():
df.loc[index, 'New'] = row['Age'] * 2
df['New'] = df['Age'] * 2
2. 使用 apply()
优化
df['Name Length'] = df['Name'].apply(len) # 计算名字长度
3. 内存优化
df.info()
查看内存占用。category
类型:
df['City'] = df['City'].astype('category')
九、实战案例:销售数据分析
1. 数据准备
data = {
'Date': ['2023-01-01', '2023-01-01', '2023-01-02'],
'Product': ['A', 'B', 'A'],
'Sales': [100, 200, 150]
}
df = pd.DataFrame(data)
df['Date'] = pd.to_datetime(df['Date'])
2. 分析过程
# 按日期和产品分组统计总销量
sales_summary = df.groupby(['Date', 'Product'])['Sales'].sum().unstack()
# 计算每个产品的月销量占比
sales_summary['Total'] = sales_summary.sum(axis=1)
sales_summary['A_Pct'] = sales_summary['A'] / sales_summary['Total']
3. 输出结果
print(sales_summary)
十、常见问题与解决方案
-
读取大文件内存不足
- 分块读取:
pd.read_csv('data.csv', chunksize=1000)
- 指定列类型:
dtype={'column': 'int32'}
-
合并数据时键重复
- 使用
validate
参数检查合并类型:pd.merge(df1, df2, on='key', validate='one_to_one')
-
处理时区问题
- 转换时区:
df['Date'].dt.tz_localize('UTC').dt.tz_convert('Asia/Shanghai')
十一、学习资源推荐
掌握 Pandas 的核心操作后,可以高效完成 数据清洗、转换、分析和可视化,为机器学习、商业分析等任务打下坚实基础。建议通过实际项目练习,逐步深入高级功能!
作者:晴雨日记