Pandas 是一个强大的 Python 数据分析库,提供了一系列用于数据处理和分析的功能。以下是一些常用的 Pandas 操作及其案例:
1. 读取和写入数据
Pandas 支持从多种文件格式读取数据,如 CSV、Excel、JSON 等,并将数据写入这些格式的文件。
读取 CSV 文件:
import pandas as pd
# 读取 CSV 文件
df = pd.read_csv('data.csv')
写入 CSV 文件:
# 将 DataFrame 写入 CSV 文件
df.to_csv('output.csv', index=False)
2. 数据选择和索引
可以使用多种方式选择和索引 DataFrame 中的数据。
选择列:
# 选择单列
prices = df['price']
# 选择多列
subset = df[['product', 'price']]
选择行:
# 通过行号选择行
row = df.iloc[0]
# 通过条件表达式选择行
filtered_rows = df[df['price'] > 10]
3. 数据清洗
Pandas 提供了多种方法用于数据清洗,包括处理缺失数据、重命名列等。
处理缺失数据:
# 填充缺失值
df.fillna(value=0, inplace=True)
# 删除包含缺失值的行
df.dropna(inplace=True)
重命名列:
# 重命名列
df.rename(columns={'old_name': 'new_name'}, inplace=True)
4. 数据转换
可以对数据进行转换,比如应用函数、聚合、合并等。
应用函数:
# 使用 apply() 应用函数到每个元素
df['price'] = df['price'].apply(lambda x: x * 1.1)
聚合:
# 按 'category' 列聚合,并计算每组的平均价格
category_avg = df.groupby('category')['price'].mean()
5. 排序
可以对数据进行排序。
按列排序:
# 按 'price' 列升序排序
df.sort_values(by='price', ascending=True, inplace=True)
6. 数据合并
可以合并多个 DataFrame。
合并(Join):
# 假设有另一个 DataFrame,包含产品的额外信息
df_info = pd.DataFrame({
'product': ['apple', 'banana', 'cherry'],
'info': ['info1', 'info2', 'info3']
})
# 按 'product' 列合并两个 DataFrame
df_merged = df.merge(df_info, on='product')
7. 数据重塑
可以重塑数据结构,比如使用透视表。
透视表:
# 创建透视表,查看每个产品的每种情况的销售总额
pivot_table = df.pivot_table(values='sales', index='product', columns='condition', aggfunc='sum')
8. 时间序列处理
Pandas 提供了强大的时间序列处理能力。
解析日期列:
# 将字符串列解析为 datetime 对象
df['date'] = pd.to_datetime(df['date_column'], format='%Y-%m-%d')
重采样时间序列数据:
# 将数据按月份重采样,并计算每月的平均值
monthly_average = df.resample('M', on='date').mean()
时间戳和时间周期转换:
# 将 datetime 对象转换为时间周期
df['period'] = df['date'].dt.to_period('M')
9. 多层索引(Hierarchical indexing)
Pandas 允许创建多层索引,也称为 MultiIndex,提供了对高维数据的灵活处理方式。
创建多层索引:
# 设置多层索引
df_multi_index = df.set_index(['category', 'product'])
多层索引的切片:
# 使用 loc 访问多层索引
subset = df_multi_index.loc[('Fruit', 'apple')]
10. 数据可视化
Pandas 集成了 Matplotlib,可以直接在 DataFrame 和 Series 上进行数据可视化。
数据可视化:
import matplotlib.pyplot as plt
# 绘制价格的直方图
df['price'].hist(bins=20)
plt.show()
11. 数据聚合和分组运算
除了基本的聚合函数,Pandas 还允许进行更复杂的分组运算。
自定义聚合:
# 自定义聚合函数,返回最大值减去最小值
def range_diff(series):
return series.max() - series.min()
# 应用自定义聚合函数
df.groupby('category')['price'].agg(range_diff)
12. 连接和合并数据集
Pandas 允许使用多种方式连接数据集,包括纵向合并和横向合并。
横向合并(Concatenation):
# 假设有另一个 DataFrame,包含额外的数据行
df_additional = pd.DataFrame({
'product': ['orange', 'watermelon'],
'price': [0.30, 0.80]
})
# 纵向合并 DataFrame
df_concatenated = pd.concat([df, df_additional], ignore_index=True)
13. 数据透视和交叉表
可以使用数据透视表或交叉表进行数据摘要和分析。
交叉表(Crosstab):
# 创建交叉表,显示产品和条件组合的频数
pd.crosstab(df['product'], df['condition'])
14. 缺失数据插补
Pandas 提供了多种方法来插补缺失数据。
插补缺失数据:
# 使用前向填充插补缺失数据
df.fillna(method='ffill', inplace=True)
# 使用插值方法插补缺失数据
df.interpolate(method='linear', inplace=True)
15. 数据过滤
可以使用条件过滤来提取符合特定条件的数据。
使用 query 方法过滤:
# 使用 query 方法根据条件过滤数据
df_filtered = df.query('price > 10 & condition == "New"')
16. 分类数据处理
Pandas 提供了分类数据类型,它可以用来表示具有有限可能值的变量。
创建分类类型:
# 将列转换为分类类型
df['category'] = df['category'].astype('category')
排序分类数据:
# 对分类数据进行排序
df.sort_values(by='category', key=lambda col: col.cat.codes)
17. 文本数据处理
Pandas 提供了丰富的字符串操作方法,可以直接应用于字符串 Series 或 Index。
字符串操作:
# 调用字符串方法进行大写转换
df['product'] = df['product'].str.upper()
# 使用 contains() 查找包含特定字符串的行
df_filtered = df[df['product'].str.contains('APPLE')]
18. 数据分桶和离散化
对数值数据进行分桶或离散化,可以把连续变量转换为分类变量。
数据分桶(Binning):
# 使用 cut 将数据分为几个区间
df['price_bin'] = pd.cut(df['price'], bins=[0, 1, 3, 5], labels=['Low', 'Medium', 'High'])
19. 数据替换
在数据清洗过程中,有时需要替换 DataFrame 中的值。
替换数据:
# 替换特定的值
df.replace(to_replace='old_value', value='new_value', inplace=True)
20. 数据帧的迭代
虽然通常推荐使用矢量化操作,但有时可能需要迭代数据帧中的行或列。
迭代行:
# 迭代 DataFrame 的行
for index, row in df.iterrows():
print(index, row['product'], row['price'])
21. 数据帧的变换
使用 transform 方法可以对组数据应用一个或多个函数。
变换数据:
# 对分组数据进行变换
df['discounted_price'] = df.groupby('category')['price'].transform(lambda x: x * 0.9)
22. 数据帧的逐元素操作
逐元素操作可用于 DataFrame 或 Series 的数据项。
逐元素操作:
# 使用 applymap 对 DataFrame 的每个元素应用函数
df = df.applymap(lambda x: x.lower() if isinstance(x, str) else x)
23. 数据帧的样式化
Pandas 允许给数据帧添加样式,这对于生成报告非常有用。
样式化数据帧:
# 使用样式化的数据帧
styled = df.style.format({'price': "${:.2f}"}) \
.highlight_max(subset=['price'], color='yellow')
24. 数据帧的轴向操作
Pandas 允许在不同轴上执行操作,例如删除行或列。
轴向操作:
# 删除列
df.drop('price_bin', axis=1, inplace=True)
# 删除行
df.drop(index=[0, 1], inplace=True)
25. 数据帧的链式调用
Pandas 支持使用链式调用,这使得代码更易于阅读和编写。
链式调用:
# 使用链式调用进行多步操作
(df.assign(discounted_price=lambda x: x['price'] * 0.9)
.query('discounted_price < 10')
.sort_values('discounted_price'))
这些操作示例展示了 Pandas 的多样性和灵活性,无论是在数据预处理、清洗、转换、还是在数据分析阶段,Pandas 都是一个非常有用的工具,掌握这些操作有助于深入挖掘数据的潜力。