活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

Python数据科学必备Pandas库全面指南从基础操作到高级应用提升数据分析能力适合初学者和进阶用户助你成为数据专家

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-2 00:50:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

Pandas是Python数据科学生态系统中最重要的库之一,它提供了高性能、易于使用的数据结构和数据分析工具。无论你是数据分析师、数据科学家还是研究人员,掌握Pandas都是提升数据分析能力的关键一步。本指南将带你从Pandas的基础操作开始,逐步深入到高级应用,帮助你全面掌握这个强大的工具,从而在数据分析的道路上更加得心应手。

Pandas由Wes McKinney于2008年创建,其名称源自”Panel Data”(面板数据)一词。它建立在NumPy库的基础上,提供了更高级、更灵活的数据操作功能。Pandas的核心数据结构是Series(一维)和DataFrame(二维),它们使得处理表格数据、时间序列数据等变得异常简单。

在本指南中,我们将通过大量的实例和代码,深入探讨Pandas的各个方面,帮助你从初学者成长为数据专家。

Pandas基础

安装和导入

在开始使用Pandas之前,首先需要安装它。最常用的安装方式是通过pip:
  1. pip install pandas
复制代码

或者使用conda:
  1. conda install pandas
复制代码

安装完成后,我们可以在Python脚本或Jupyter Notebook中导入Pandas:
  1. import pandas as pd
  2. import numpy as np
复制代码

通常,我们也会导入NumPy,因为Pandas与NumPy紧密集成,许多操作会用到NumPy的功能。

数据结构:Series和DataFrame

Pandas有两个主要的数据结构:Series和DataFrame。

Series是一种类似于一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。创建一个Series的基本语法如下:
  1. # 创建一个简单的Series
  2. s = pd.Series([1, 3, 5, np.nan, 6, 8])
  3. print(s)
复制代码

输出:
  1. 0    1.0
  2. 1    3.0
  3. 2    5.0
  4. 3    NaN
  5. 4    6.0
  6. 5    8.0
  7. dtype: float64
复制代码

我们也可以为Series指定索引:
  1. # 创建带有自定义索引的Series
  2. s = pd.Series([1, 3, 5, np.nan, 6, 8], index=['a', 'b', 'c', 'd', 'e', 'f'])
  3. print(s)
复制代码

输出:
  1. a    1.0
  2. b    3.0
  3. c    5.0
  4. d    NaN
  5. e    6.0
  6. f    8.0
  7. dtype: float64
复制代码

Series可以通过索引访问数据:
  1. # 通过索引访问数据
  2. print(s['a'])  # 输出: 1.0
  3. print(s[0])    # 输出: 1.0
复制代码

DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看作是由Series组成的字典(共用同一个索引)。

创建DataFrame的方法有很多,最常见的是从字典创建:
  1. # 从字典创建DataFrame
  2. data = {
  3.     'Name': ['Alice', 'Bob', 'Charlie', 'David'],
  4.     'Age': [25, 30, 35, 40],
  5.     'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']
  6. }
  7. df = pd.DataFrame(data)
  8. print(df)
复制代码

输出:
  1. Name  Age         City
  2. 0    Alice   25     New York
  3. 1      Bob   30  Los Angeles
  4. 2  Charlie   35      Chicago
  5. 3    David   40      Houston
复制代码

我们也可以从NumPy数组创建DataFrame:
  1. # 从NumPy数组创建DataFrame
  2. array = np.random.rand(5, 3)  # 创建一个5行3列的随机数组
  3. df = pd.DataFrame(array, columns=['A', 'B', 'C'])
  4. print(df)
复制代码

输出:
  1. A         B         C
  2. 0  0.123456  0.789012  0.345678
  3. 1  0.234567  0.890123  0.456789
  4. 2  0.345678  0.901234  0.567890
  5. 3  0.456789  0.012345  0.678901
  6. 4  0.567890  0.123456  0.789012
复制代码

基本操作:创建、查看、选择数据

除了前面介绍的方法,我们还可以从CSV文件、Excel文件、数据库等创建DataFrame:
  1. # 从CSV文件创建DataFrame
  2. # df = pd.read_csv('data.csv')
  3. # 从Excel文件创建DataFrame
  4. # df = pd.read_excel('data.xlsx')
  5. # 从SQL数据库创建DataFrame
  6. # import sqlite3
  7. # conn = sqlite3.connect('database.db')
  8. # df = pd.read_sql('SELECT * FROM table_name', conn)
复制代码

Pandas提供了多种方法来查看DataFrame的内容:
  1. # 创建一个示例DataFrame
  2. data = {
  3.     'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
  4.     'Age': [25, 30, 35, 40, 45],
  5.     'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix'],
  6.     'Salary': [50000, 60000, 70000, 80000, 90000]
  7. }
  8. df = pd.DataFrame(data)
  9. # 查看前n行数据,默认n=5
  10. print(df.head())
  11. # 查看后n行数据,默认n=5
  12. print(df.tail())
  13. # 查看数据的形状(行数和列数)
  14. print(df.shape)  # 输出: (5, 4)
  15. # 查看数据的列名
  16. print(df.columns)
  17. # 查看数据的基本信息
  18. print(df.info())
  19. # 查看数据的统计摘要
  20. print(df.describe())
  21. # 查看数据的前几行和后几行
  22. print(df.head(2))
  23. print(df.tail(2))
复制代码

Pandas提供了多种方法来选择数据:
  1. # 选择单列
  2. print(df['Name'])
  3. # 或者
  4. print(df.Name)
  5. # 选择多列
  6. print(df[['Name', 'Age']])
  7. # 使用loc选择行(基于标签)
  8. print(df.loc[0])  # 选择第一行
  9. print(df.loc[0:2])  # 选择前三行
  10. # 使用iloc选择行(基于位置)
  11. print(df.iloc[0])  # 选择第一行
  12. print(df.iloc[0:3])  # 选择前三行
  13. # 使用loc选择特定行和列
  14. print(df.loc[0:2, ['Name', 'Age']])
  15. # 使用iloc选择特定行和列
  16. print(df.iloc[0:3, 0:2])
  17. # 条件选择
  18. print(df[df['Age'] > 30])  # 选择年龄大于30的行
  19. # 多条件选择
  20. print(df[(df['Age'] > 30) & (df['City'] == 'Chicago')])  # 选择年龄大于30且城市为芝加哥的行
  21. # 使用isin方法
  22. print(df[df['City'].isin(['New York', 'Chicago'])])  # 选择城市为纽约或芝加哥的行
复制代码

数据清洗和预处理

数据清洗和预处理是数据分析过程中至关重要的一步。Pandas提供了丰富的功能来处理缺失值、转换数据类型、处理重复值和异常值。

处理缺失值

在实际数据中,缺失值是非常常见的。Pandas使用NaN(Not a Number)来表示缺失值。
  1. # 创建一个包含缺失值的DataFrame
  2. data = {
  3.     'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
  4.     'Age': [25, 30, np.nan, 40, 45],
  5.     'City': ['New York', 'Los Angeles', 'Chicago', np.nan, 'Phoenix'],
  6.     'Salary': [50000, 60000, 70000, np.nan, 90000]
  7. }
  8. df = pd.DataFrame(data)
  9. # 检测缺失值
  10. print(df.isnull())
  11. # 计算每列的缺失值数量
  12. print(df.isnull().sum())
  13. # 删除包含缺失值的行
  14. df_dropna = df.dropna()
  15. print(df_dropna)
  16. # 删除包含缺失值的列
  17. df_dropna_columns = df.dropna(axis=1)
  18. print(df_dropna_columns)
  19. # 填充缺失值
  20. # 用特定值填充
  21. df_fill_value = df.fillna(0)
  22. print(df_fill_value)
  23. # 用均值填充
  24. df_fill_mean = df.copy()
  25. df_fill_mean['Age'] = df_fill_mean['Age'].fillna(df_fill_mean['Age'].mean())
  26. df_fill_mean['Salary'] = df_fill_mean['Salary'].fillna(df_fill_mean['Salary'].mean())
  27. print(df_fill_mean)
  28. # 用前一个值填充(向前填充)
  29. df_fill_ffill = df.fillna(method='ffill')
  30. print(df_fill_ffill)
  31. # 用后一个值填充(向后填充)
  32. df_fill_bfill = df.fillna(method='bfill')
  33. print(df_fill_bfill)
  34. # 插值填充
  35. df_interpolate = df.copy()
  36. df_interpolate['Age'] = df_interpolate['Age'].interpolate()
  37. print(df_interpolate)
复制代码

数据类型转换

在数据分析过程中,经常需要转换数据类型以适应不同的分析需求。
  1. # 创建一个示例DataFrame
  2. data = {
  3.     'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
  4.     'Age': ['25', '30', '35', '40', '45'],
  5.     'Salary': ['50000', '60000', '70000', '80000', '90000'],
  6.     'Join_Date': ['2020-01-01', '2019-05-15', '2018-11-20', '2017-03-10', '2021-07-05']
  7. }
  8. df = pd.DataFrame(data)
  9. # 查看数据类型
  10. print(df.dtypes)
  11. # 转换数据类型
  12. df['Age'] = df['Age'].astype(int)
  13. df['Salary'] = df['Salary'].astype(float)
  14. print(df.dtypes)
  15. # 转换日期类型
  16. df['Join_Date'] = pd.to_datetime(df['Join_Date'])
  17. print(df.dtypes)
  18. # 使用astype进行批量转换
  19. df = df.astype({
  20.     'Age': 'int32',
  21.     'Salary': 'float32'
  22. })
  23. print(df.dtypes)
  24. # 使用pd.to_numeric进行转换,可以处理错误值
  25. data = {
  26.     'Value': ['1', '2', '3', '4', 'five']
  27. }
  28. df_error = pd.DataFrame(data)
  29. df_error['Value'] = pd.to_numeric(df_error['Value'], errors='coerce')  # 无法转换的值设为NaN
  30. print(df_error)
复制代码

重复值处理

重复值可能会影响数据分析的结果,因此需要检测和处理。
  1. # 创建一个包含重复值的DataFrame
  2. data = {
  3.     'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva', 'Alice'],
  4.     'Age': [25, 30, 35, 40, 45, 25],
  5.     'City': ['New York', 'Los Angeles', 'Chicago', 'Houston', 'Phoenix', 'New York']
  6. }
  7. df = pd.DataFrame(data)
  8. # 检测重复行
  9. print(df.duplicated())
  10. # 统计重复行的数量
  11. print(df.duplicated().sum())
  12. # 删除重复行
  13. df_drop_duplicates = df.drop_duplicates()
  14. print(df_drop_duplicates)
  15. # 基于特定列删除重复行
  16. df_drop_duplicates_subset = df.drop_duplicates(subset=['Name'])
  17. print(df_drop_duplicates_subset)
  18. # 保留最后一个重复行
  19. df_keep_last = df.drop_duplicates(keep='last')
  20. print(df_keep_last)
复制代码

异常值检测和处理

异常值是数据集中与其他观测值显著不同的数据点,可能会影响分析结果。
  1. # 创建一个包含异常值的DataFrame
  2. np.random.seed(42)
  3. data = {
  4.     'Value': np.concatenate([np.random.normal(0, 1, 50), [10, -10]])
  5. }
  6. df = pd.DataFrame(data)
  7. # 使用箱线图检测异常值
  8. import matplotlib.pyplot as plt
  9. df.boxplot()
  10. plt.show()
  11. # 使用Z-score检测异常值
  12. from scipy import stats
  13. z_scores = np.abs(stats.zscore(df['Value']))
  14. threshold = 3  # 通常使用3作为阈值
  15. outliers = np.where(z_scores > threshold)
  16. print("异常值的索引:", outliers[0])
  17. # 使用IQR(四分位距)检测异常值
  18. Q1 = df['Value'].quantile(0.25)
  19. Q3 = df['Value'].quantile(0.75)
  20. IQR = Q3 - Q1
  21. lower_bound = Q1 - 1.5 * IQR
  22. upper_bound = Q3 + 1.5 * IQR
  23. outliers = df[(df['Value'] < lower_bound) | (df['Value'] > upper_bound)]
  24. print("异常值:")
  25. print(outliers)
  26. # 处理异常值
  27. # 删除异常值
  28. df_no_outliers = df[(df['Value'] >= lower_bound) & (df['Value'] <= upper_bound)]
  29. print("删除异常值后的数据:")
  30. print(df_no_outliers)
  31. # 替换异常值
  32. df_replace_outliers = df.copy()
  33. df_replace_outliers.loc[df_replace_outliers['Value'] < lower_bound, 'Value'] = lower_bound
  34. df_replace_outliers.loc[df_replace_outliers['Value'] > upper_bound, 'Value'] = upper_bound
  35. print("替换异常值后的数据:")
  36. print(df_replace_outliers)
复制代码

数据操作和转换

在数据分析过程中,经常需要对数据进行各种操作和转换,以满足分析需求。Pandas提供了丰富的功能来实现这些操作。

数据排序
  1. # 创建一个示例DataFrame
  2. data = {
  3.     'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva'],
  4.     'Age': [25, 30, 35, 40, 45],
  5.     'Salary': [50000, 60000, 70000, 80000, 90000]
  6. }
  7. df = pd.DataFrame(data)
  8. # 按单列排序
  9. df_sorted_age = df.sort_values('Age')
  10. print("按年龄升序排序:")
  11. print(df_sorted_age)
  12. # 按单列降序排序
  13. df_sorted_age_desc = df.sort_values('Age', ascending=False)
  14. print("按年龄降序排序:")
  15. print(df_sorted_age_desc)
  16. # 按多列排序
  17. df_sorted_multi = df.sort_values(['Age', 'Salary'])
  18. print("按年龄和薪资排序:")
  19. print(df_sorted_multi)
  20. # 按多列不同顺序排序
  21. df_sorted_multi_diff = df.sort_values(['Age', 'Salary'], ascending=[True, False])
  22. print("按年龄升序和薪资降序排序:")
  23. print(df_sorted_multi_diff)
  24. # 按索引排序
  25. df_sorted_index = df.sort_index()
  26. print("按索引排序:")
  27. print(df_sorted_index)
复制代码

数据分组和聚合

分组和聚合是数据分析中常用的操作,Pandas的groupby方法提供了强大的功能。
  1. # 创建一个示例DataFrame
  2. data = {
  3.     'Department': ['HR', 'IT', 'HR', 'IT', 'Finance', 'Finance', 'HR', 'IT'],
  4.     'Employee': ['Alice', 'Bob', 'Charlie', 'David', 'Eva', 'Frank', 'Grace', 'Henry'],
  5.     'Salary': [50000, 60000, 55000, 70000, 80000, 75000, 52000, 65000],
  6.     'Years_of_Experience': [2, 5, 3, 7, 10, 8, 4, 6]
  7. }
  8. df = pd.DataFrame(data)
  9. # 按部门分组并计算平均薪资
  10. dept_avg_salary = df.groupby('Department')['Salary'].mean()
  11. print("各部门的平均薪资:")
  12. print(dept_avg_salary)
  13. # 按部门分组并计算多个统计量
  14. dept_stats = df.groupby('Department')['Salary'].agg(['mean', 'median', 'min', 'max', 'std'])
  15. print("各部门薪资的统计信息:")
  16. print(dept_stats)
  17. # 按部门分组并对多个列应用不同的聚合函数
  18. dept_multi_agg = df.groupby('Department').agg({
  19.     'Salary': ['mean', 'max'],
  20.     'Years_of_Experience': 'mean'
  21. })
  22. print("各部门的多列聚合:")
  23. print(dept_multi_agg)
  24. # 使用自定义聚合函数
  25. def salary_range(x):
  26.     return x.max() - x.min()
  27. dept_salary_range = df.groupby('Department')['Salary'].agg(salary_range)
  28. print("各部门的薪资范围:")
  29. print(dept_salary_range)
  30. # 分组后应用转换操作
  31. df['Salary_normalized'] = df.groupby('Department')['Salary'].transform(lambda x: (x - x.mean()) / x.std())
  32. print("添加标准化薪资列:")
  33. print(df)
  34. # 分组后应用过滤操作
  35. dept_filtered = df.groupby('Department').filter(lambda x: x['Salary'].mean() > 60000)
  36. print("平均薪资大于60000的部门:")
  37. print(dept_filtered)
  38. # 分组后应用apply操作
  39. dept_apply = df.groupby('Department').apply(lambda x: x.sort_values('Salary', ascending=False))
  40. print("各部门按薪资降序排序:")
  41. print(dept_apply)
复制代码

数据合并和连接

在数据分析中,经常需要将多个数据集合并或连接在一起。Pandas提供了merge、join和concat等方法来实现这些操作。
  1. # 创建示例DataFrame
  2. df1 = pd.DataFrame({
  3.     'ID': [1, 2, 3, 4],
  4.     'Name': ['Alice', 'Bob', 'Charlie', 'David'],
  5.     'Age': [25, 30, 35, 40]
  6. })
  7. df2 = pd.DataFrame({
  8.     'ID': [1, 2, 3, 5],
  9.     'Salary': [50000, 60000, 70000, 80000],
  10.     'Department': ['HR', 'IT', 'Finance', 'Marketing']
  11. })
  12. # 内连接(只保留两个表中都存在的ID)
  13. df_inner = pd.merge(df1, df2, on='ID', how='inner')
  14. print("内连接:")
  15. print(df_inner)
  16. # 左连接(保留左表的所有行)
  17. df_left = pd.merge(df1, df2, on='ID', how='left')
  18. print("左连接:")
  19. print(df_left)
  20. # 右连接(保留右表的所有行)
  21. df_right = pd.merge(df1, df2, on='ID', how='right')
  22. print("右连接:")
  23. print(df_right)
  24. # 外连接(保留两个表的所有行)
  25. df_outer = pd.merge(df1, df2, on='ID', how='outer')
  26. print("外连接:")
  27. print(df_outer)
  28. # 基于多个列的连接
  29. df3 = pd.DataFrame({
  30.     'ID': [1, 2, 3, 4],
  31.     'Name': ['Alice', 'Bob', 'Charlie', 'David'],
  32.     'Department': ['HR', 'IT', 'Finance', 'Marketing']
  33. })
  34. df4 = pd.DataFrame({
  35.     'ID': [1, 2, 3, 5],
  36.     'Name': ['Alice', 'Bob', 'Charlie', 'Eve'],
  37.     'Salary': [50000, 60000, 70000, 80000]
  38. })
  39. df_multi_key = pd.merge(df3, df4, on=['ID', 'Name'], how='inner')
  40. print("基于多个列的连接:")
  41. print(df_multi_key)
  42. # 连接列名不同的情况
  43. df5 = pd.DataFrame({
  44.     'ID': [1, 2, 3, 4],
  45.     'Name': ['Alice', 'Bob', 'Charlie', 'David'],
  46.     'Age': [25, 30, 35, 40]
  47. })
  48. df6 = pd.DataFrame({
  49.     'Employee_ID': [1, 2, 3, 5],
  50.     'Salary': [50000, 60000, 70000, 80000]
  51. })
  52. df_diff_col_names = pd.merge(df5, df6, left_on='ID', right_on='Employee_ID', how='inner')
  53. print("连接列名不同的情况:")
  54. print(df_diff_col_names)
  55. # 使用concat进行纵向连接
  56. df7 = pd.DataFrame({
  57.     'ID': [5, 6, 7],
  58.     'Name': ['Eve', 'Frank', 'Grace'],
  59.     'Age': [45, 50, 55]
  60. })
  61. df_concat_vertical = pd.concat([df1, df7], ignore_index=True)
  62. print("纵向连接:")
  63. print(df_concat_vertical)
  64. # 使用concat进行横向连接
  65. df8 = pd.DataFrame({
  66.     'Salary': [50000, 60000, 70000, 80000],
  67.     'Department': ['HR', 'IT', 'Finance', 'Marketing']
  68. })
  69. df_concat_horizontal = pd.concat([df1, df8], axis=1)
  70. print("横向连接:")
  71. print(df_concat_horizontal)
  72. # 使用join方法
  73. df9 = pd.DataFrame({
  74.     'Salary': [50000, 60000, 70000, 80000],
  75.     'Department': ['HR', 'IT', 'Finance', 'Marketing']
  76. }, index=[1, 2, 3, 4])
  77. df_join = df1.set_index('ID').join(df9)
  78. print("使用join方法:")
  79. print(df_join)
复制代码

数据透视表

数据透视表是一种强大的数据汇总工具,可以按照不同的维度对数据进行汇总和分析。
  1. # 创建一个示例DataFrame
  2. data = {
  3.     'Date': pd.date_range(start='2023-01-01', periods=12),
  4.     'Region': ['North', 'South', 'East', 'West'] * 3,
  5.     'Product': ['A', 'B', 'C', 'D'] * 3,
  6.     'Sales': [100, 200, 150, 300, 120, 220, 180, 320, 110, 210, 160, 310],
  7.     'Quantity': [10, 20, 15, 30, 12, 22, 18, 32, 11, 21, 16, 31]
  8. }
  9. df = pd.DataFrame(data)
  10. # 创建基本的数据透视表
  11. pivot1 = pd.pivot_table(df, values='Sales', index='Region', columns='Product', aggfunc='sum')
  12. print("基本数据透视表:")
  13. print(pivot1)
  14. # 添加多个值列
  15. pivot2 = pd.pivot_table(df, values=['Sales', 'Quantity'], index='Region', columns='Product', aggfunc='sum')
  16. print("多值列数据透视表:")
  17. print(pivot2)
  18. # 添加多个聚合函数
  19. pivot3 = pd.pivot_table(df, values='Sales', index='Region', columns='Product', aggfunc=['sum', 'mean'])
  20. print("多聚合函数数据透视表:")
  21. print(pivot3)
  22. # 添加行和列的小计
  23. pivot4 = pd.pivot_table(df, values='Sales', index='Region', columns='Product', aggfunc='sum', margins=True)
  24. print("带小计的数据透视表:")
  25. print(pivot4)
  26. # 使用多个索引
  27. pivot5 = pd.pivot_table(df, values='Sales', index=['Region', 'Product'], aggfunc='sum')
  28. print("多索引数据透视表:")
  29. print(pivot5)
  30. # 填充缺失值
  31. pivot6 = pd.pivot_table(df, values='Sales', index='Region', columns='Product', aggfunc='sum', fill_value=0)
  32. print("填充缺失值的数据透视表:")
  33. print(pivot6)
  34. # 使用pivot方法(与pivot_table不同,pivot不进行聚合)
  35. pivot7 = df.pivot(index='Date', columns='Region', values='Sales')
  36. print("使用pivot方法:")
  37. print(pivot7)
  38. # 使用crosstab方法(交叉表)
  39. cross_tab = pd.crosstab(df['Region'], df['Product'], values=df['Sales'], aggfunc='sum')
  40. print("交叉表:")
  41. print(cross_tab)
复制代码

时间序列数据处理

时间序列数据是数据分析中常见的数据类型,Pandas提供了强大的时间序列处理功能。

时间序列基础
  1. # 创建时间序列
  2. # 使用date_range创建日期范围
  3. dates = pd.date_range(start='2023-01-01', end='2023-01-10')
  4. print("日期范围:")
  5. print(dates)
  6. # 创建时间序列DataFrame
  7. ts_data = {
  8.     'Date': pd.date_range(start='2023-01-01', periods=10),
  9.     'Value': np.random.randn(10)
  10. }
  11. ts_df = pd.DataFrame(ts_data)
  12. print("时间序列DataFrame:")
  13. print(ts_df)
  14. # 将日期列设为索引
  15. ts_df_indexed = ts_df.set_index('Date')
  16. print("将日期设为索引:")
  17. print(ts_df_indexed)
  18. # 从字符串创建时间序列
  19. string_dates = ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05']
  20. ts_from_strings = pd.to_datetime(string_dates)
  21. print("从字符串创建时间序列:")
  22. print(ts_from_strings)
  23. # 访问时间序列的组件
  24. ts_df_indexed['Year'] = ts_df_indexed.index.year
  25. ts_df_indexed['Month'] = ts_df_indexed.index.month
  26. ts_df_indexed['Day'] = ts_df_indexed.index.day
  27. ts_df_indexed['DayOfWeek'] = ts_df_indexed.index.dayofweek
  28. ts_df_indexed['DayName'] = ts_df_indexed.index.day_name()
  29. print("添加时间组件:")
  30. print(ts_df_indexed)
  31. # 时间序列切片
  32. print("切片2023-01-03到2023-01-07:")
  33. print(ts_df_indexed['2023-01-03':'2023-01-07'])
  34. # 按年份切片
  35. print("切片2023年的数据:")
  36. print(ts_df_indexed['2023'])
  37. # 按月份切片
  38. print("切片1月的数据:")
  39. print(ts_df_indexed['2023-01'])
复制代码

时间序列重采样

重采样是将时间序列从一个频率转换到另一个频率的过程。Pandas提供了resample方法来实现这一功能。
  1. # 创建一个更高频率的时间序列
  2. high_freq_data = {
  3.     'Date': pd.date_range(start='2023-01-01', periods=30, freq='D'),
  4.     'Value': np.random.randn(30)
  5. }
  6. high_freq_df = pd.DataFrame(high_freq_data).set_index('Date')
  7. print("高频时间序列:")
  8. print(high_freq_df.head())
  9. # 降采样(从高频率到低频率)
  10. # 按周重采样,计算每周的平均值
  11. weekly_mean = high_freq_df.resample('W').mean()
  12. print("按周重采样(平均值):")
  13. print(weekly_mean)
  14. # 按周重采样,计算每周的总和
  15. weekly_sum = high_freq_df.resample('W').sum()
  16. print("按周重采样(总和):")
  17. print(weekly_sum)
  18. # 按月重采样
  19. monthly_mean = high_freq_df.resample('M').mean()
  20. print("按月重采样(平均值):")
  21. print(monthly_mean)
  22. # 使用自定义聚合函数
  23. weekly_custom = high_freq_df.resample('W').agg({'Value': ['mean', 'std', 'min', 'max']})
  24. print("自定义聚合函数:")
  25. print(weekly_custom)
  26. # 升采样(从低频率到高频率)
  27. low_freq_data = {
  28.     'Date': pd.date_range(start='2023-01-01', periods=5, freq='W'),
  29.     'Value': np.random.randn(5)
  30. }
  31. low_freq_df = pd.DataFrame(low_freq_data).set_index('Date')
  32. print("低频时间序列:")
  33. print(low_freq_df)
  34. # 升采样到日频率,使用前向填充
  35. daily_ffill = low_freq_df.resample('D').ffill()
  36. print("升采样到日频率(前向填充):")
  37. print(daily_ffill.head(10))
  38. # 升采样到日频率,使用后向填充
  39. daily_bfill = low_freq_df.resample('D').bfill()
  40. print("升采样到日频率(后向填充):")
  41. print(daily_bfill.head(10))
  42. # 升采样到日频率,使用插值
  43. daily_interpolate = low_freq_df.resample('D').interpolate()
  44. print("升采样到日频率(插值):")
  45. print(daily_interpolate.head(10))
复制代码

滚动窗口计算

滚动窗口计算是时间序列分析中的重要技术,可以用来计算移动平均、移动标准差等。
  1. # 创建时间序列数据
  2. ts_data = {
  3.     'Date': pd.date_range(start='2023-01-01', periods=30, freq='D'),
  4.     'Value': np.random.randn(30).cumsum()  # 累积和,使数据有趋势
  5. }
  6. ts_df = pd.DataFrame(ts_data).set_index('Date')
  7. print("时间序列数据:")
  8. print(ts_df.head(10))
  9. # 计算滚动平均(窗口大小为3)
  10. ts_df['Rolling_Mean_3'] = ts_df['Value'].rolling(window=3).mean()
  11. print("3日滚动平均:")
  12. print(ts_df.head(10))
  13. # 计算滚动平均(窗口大小为7)
  14. ts_df['Rolling_Mean_7'] = ts_df['Value'].rolling(window=7).mean()
  15. print("7日滚动平均:")
  16. print(ts_df.head(10))
  17. # 计算滚动标准差
  18. ts_df['Rolling_Std_3'] = ts_df['Value'].rolling(window=3).std()
  19. print("3日滚动标准差:")
  20. print(ts_df.head(10))
  21. # 计算滚动最大值和最小值
  22. ts_df['Rolling_Max_7'] = ts_df['Value'].rolling(window=7).max()
  23. ts_df['Rolling_Min_7'] = ts_df['Value'].rolling(window=7).min()
  24. print("7日滚动最大值和最小值:")
  25. print(ts_df.head(10))
  26. # 计算滚动相关系数
  27. ts_df['Value2'] = np.random.randn(30).cumsum()
  28. ts_df['Rolling_Corr'] = ts_df['Value'].rolling(window=7).corr(ts_df['Value2'])
  29. print("7日滚动相关系数:")
  30. print(ts_df.head(10))
  31. # 使用扩展窗口(计算从开始到当前点的统计量)
  32. ts_df['Expanding_Mean'] = ts_df['Value'].expanding().mean()
  33. ts_df['Expanding_Std'] = ts_df['Value'].expanding().std()
  34. print("扩展窗口统计量:")
  35. print(ts_df.head(10))
  36. # 使用指数加权窗口
  37. ts_df['EWM_Mean'] = ts_df['Value'].ewm(span=7).mean()
  38. print("指数加权移动平均:")
  39. print(ts_df.head(10))
复制代码

数据可视化

数据可视化是数据分析过程中的重要环节,可以帮助我们更好地理解数据。Pandas提供了简单而强大的数据可视化功能。

基本绘图
  1. # 创建示例数据
  2. np.random.seed(42)
  3. data = {
  4.     'Date': pd.date_range(start='2023-01-01', periods=100),
  5.     'Value': np.random.randn(100).cumsum(),
  6.     'Category': np.random.choice(['A', 'B', 'C', 'D'], 100)
  7. }
  8. df = pd.DataFrame(data).set_index('Date')
  9. # 绘制线图
  10. df['Value'].plot(figsize=(10, 6), title='Line Plot')
  11. plt.show()
  12. # 绘制柱状图
  13. category_counts = df['Category'].value_counts()
  14. category_counts.plot(kind='bar', figsize=(10, 6), title='Bar Plot')
  15. plt.show()
  16. # 绘制水平柱状图
  17. category_counts.plot(kind='barh', figsize=(10, 6), title='Horizontal Bar Plot')
  18. plt.show()
  19. # 绘制直方图
  20. df['Value'].plot(kind='hist', bins=20, figsize=(10, 6), title='Histogram')
  21. plt.show()
  22. # 绘制密度图
  23. df['Value'].plot(kind='density', figsize=(10, 6), title='Density Plot')
  24. plt.show()
  25. # 绘制箱线图
  26. df['Value'].plot(kind='box', figsize=(10, 6), title='Box Plot')
  27. plt.show()
  28. # 绘制面积图
  29. df['Value'].plot(kind='area', figsize=(10, 6), title='Area Plot')
  30. plt.show()
  31. # 绘制散点图
  32. df_scatter = pd.DataFrame({
  33.     'X': np.random.randn(100),
  34.     'Y': np.random.randn(100)
  35. })
  36. df_scatter.plot(kind='scatter', x='X', y='Y', figsize=(10, 6), title='Scatter Plot')
  37. plt.show()
  38. # 绘制饼图
  39. category_counts.plot(kind='pie', figsize=(10, 6), title='Pie Plot', autopct='%1.1f%%')
  40. plt.show()
复制代码

高级可视化技巧
  1. # 创建更复杂的示例数据
  2. np.random.seed(42)
  3. dates = pd.date_range(start='2023-01-01', periods=365)
  4. data = {
  5.     'Date': dates,
  6.     'Sales_A': np.random.randn(365).cumsum() + 100,
  7.     'Sales_B': np.random.randn(365).cumsum() + 50,
  8.     'Category': np.random.choice(['A', 'B', 'C'], 365),
  9.     'Region': np.random.choice(['North', 'South', 'East', 'West'], 365)
  10. }
  11. df = pd.DataFrame(data).set_index('Date')
  12. # 绘制多列线图
  13. df[['Sales_A', 'Sales_B']].plot(figsize=(12, 6), title='Multiple Line Plot')
  14. plt.show()
  15. # 绘制子图
  16. fig, axes = plt.subplots(2, 2, figsize=(12, 10))
  17. df['Sales_A'].plot(ax=axes[0, 0], title='Sales A')
  18. df['Sales_B'].plot(ax=axes[0, 1], title='Sales B')
  19. df['Sales_A'].plot(kind='hist', bins=30, ax=axes[1, 0], title='Sales A Distribution')
  20. df['Sales_B'].plot(kind='hist', bins=30, ax=axes[1, 1], title='Sales B Distribution')
  21. plt.tight_layout()
  22. plt.show()
  23. # 绘制分组柱状图
  24. category_region = df.groupby(['Category', 'Region']).size().unstack()
  25. category_region.plot(kind='bar', figsize=(12, 6), title='Category by Region')
  26. plt.show()
  27. # 绘制堆叠柱状图
  28. category_region.plot(kind='bar', stacked=True, figsize=(12, 6), title='Stacked Category by Region')
  29. plt.show()
  30. # 绘制时间序列的季节性图
  31. df_monthly = df.resample('M').mean()
  32. df_monthly[['Sales_A', 'Sales_B']].plot(kind='bar', figsize=(12, 6), title='Monthly Sales')
  33. plt.show()
  34. # 绘制热力图
  35. # 首先创建透视表
  36. pivot_table = df.pivot_table(values='Sales_A', index=df.index.month, columns=df.index.dayofweek, aggfunc='mean')
  37. plt.figure(figsize=(12, 6))
  38. plt.title('Heatmap of Sales A by Month and Day of Week')
  39. plt.imshow(pivot_table, cmap='YlGnBu', aspect='auto')
  40. plt.colorbar()
  41. plt.xlabel('Day of Week')
  42. plt.ylabel('Month')
  43. plt.show()
  44. # 绘制散点图矩阵
  45. from pandas.plotting import scatter_matrix
  46. scatter_matrix(df[['Sales_A', 'Sales_B']], figsize=(10, 10), diagonal='kde')
  47. plt.show()
  48. # 绘制自相关图
  49. from pandas.plotting import autocorrelation_plot
  50. plt.figure(figsize=(12, 6))
  51. autocorrelation_plot(df['Sales_A'])
  52. plt.title('Autocorrelation Plot of Sales A')
  53. plt.show()
  54. # 绘制滞后图
  55. from pandas.plotting import lag_plot
  56. plt.figure(figsize=(12, 6))
  57. lag_plot(df['Sales_A'])
  58. plt.title('Lag Plot of Sales A')
  59. plt.show()
复制代码

高级应用

在掌握了Pandas的基础和中级操作后,我们可以探索一些更高级的应用,这些应用可以帮助我们更高效地处理数据,并解决更复杂的问题。

性能优化

当处理大型数据集时,性能优化变得尤为重要。Pandas提供了多种方法来提高代码的执行效率。
  1. # 创建一个大型DataFrame
  2. large_df = pd.DataFrame({
  3.     'A': np.random.rand(1000000),
  4.     'B': np.random.rand(1000000),
  5.     'C': np.random.choice(['X', 'Y', 'Z'], 1000000),
  6.     'D': np.random.randint(1, 100, 1000000)
  7. })
  8. # 使用适当的数据类型
  9. # 检查当前数据类型
  10. print("原始数据类型:")
  11. print(large_df.dtypes)
  12. # 优化数据类型
  13. large_df['A'] = large_df['A'].astype('float32')  # 从float64改为float32
  14. large_df['B'] = large_df['B'].astype('float32')
  15. large_df['C'] = large_df['C'].astype('category')  # 将字符串列转换为category类型
  16. large_df['D'] = large_df['D'].astype('int16')    # 从int64改为int16
  17. print("优化后的数据类型:")
  18. print(large_df.dtypes)
  19. # 检查内存使用情况
  20. print("原始内存使用:")
  21. print(large_df.memory_usage(deep=True))
  22. # 使用向量化操作代替循环
  23. # 不推荐的方式:使用循环
  24. def add_with_loop(df):
  25.     result = []
  26.     for i in range(len(df)):
  27.         result.append(df['A'].iloc[i] + df['B'].iloc[i])
  28.     return result
  29. # 推荐的方式:使用向量化操作
  30. def add_with_vectorization(df):
  31.     return df['A'] + df['B']
  32. # 测试性能
  33. import time
  34. start_time = time.time()
  35. result_loop = add_with_loop(large_df.head(10000))  # 只使用前10000行,因为循环太慢
  36. loop_time = time.time() - start_time
  37. start_time = time.time()
  38. result_vectorization = add_with_vectorization(large_df)
  39. vectorization_time = time.time() - start_time
  40. print(f"循环方式耗时: {loop_time:.4f}秒")
  41. print(f"向量化方式耗时: {vectorization_time:.4f}秒")
  42. # 使用apply函数的优化
  43. # 不推荐的方式:使用apply
  44. def calculate_with_apply(df):
  45.     return df.apply(lambda row: row['A'] + row['B'], axis=1)
  46. # 推荐的方式:使用内置方法
  47. def calculate_with_builtin(df):
  48.     return df['A'] + df['B']
  49. # 测试性能
  50. start_time = time.time()
  51. result_apply = calculate_with_apply(large_df.head(10000))  # 只使用前10000行
  52. apply_time = time.time() - start_time
  53. start_time = time.time()
  54. result_builtin = calculate_with_builtin(large_df)
  55. builtin_time = time.time() - start_time
  56. print(f"apply方式耗时: {apply_time:.4f}秒")
  57. print(f"内置方法方式耗时: {builtin_time:.4f}秒")
  58. # 使用eval方法进行表达式求值
  59. # 不推荐的方式:使用多个中间步骤
  60. def calculate_without_eval(df):
  61.     temp1 = df['A'] + df['B']
  62.     temp2 = df['D'] * 2
  63.     return temp1 * temp2
  64. # 推荐的方式:使用eval
  65. def calculate_with_eval(df):
  66.     return df.eval('(A + B) * (D * 2)')
  67. # 测试性能
  68. start_time = time.time()
  69. result_without_eval = calculate_without_eval(large_df)
  70. without_eval_time = time.time() - start_time
  71. start_time = time.time()
  72. result_with_eval = calculate_with_eval(large_df)
  73. with_eval_time = time.time() - start_time
  74. print(f"不使用eval方式耗时: {without_eval_time:.4f}秒")
  75. print(f"使用eval方式耗时: {with_eval_time:.4f}秒")
  76. # 使用query方法进行查询
  77. # 不推荐的方式:使用布尔索引
  78. def query_without_query(df):
  79.     return df[(df['A'] > 0.5) & (df['B'] < 0.5)]
  80. # 推荐的方式:使用query
  81. def query_with_query(df):
  82.     return df.query('A > 0.5 and B < 0.5')
  83. # 测试性能
  84. start_time = time.time()
  85. result_without_query = query_without_query(large_df)
  86. without_query_time = time.time() - start_time
  87. start_time = time.time()
  88. result_with_query = query_with_query(large_df)
  89. with_query_time = time.time() - start_time
  90. print(f"不使用query方式耗时: {without_query_time:.4f}秒")
  91. print(f"使用query方式耗时: {with_query_time:.4f}秒")
复制代码

与其他库的集成

Pandas可以与Python数据科学生态系统中的许多其他库无缝集成,扩展其功能。
  1. # 与NumPy集成
  2. # Pandas建立在NumPy之上,可以轻松转换
  3. arr = np.array([[1, 2, 3], [4, 5, 6]])
  4. df_from_numpy = pd.DataFrame(arr, columns=['A', 'B', 'C'])
  5. print("从NumPy数组创建DataFrame:")
  6. print(df_from_numpy)
  7. # 从DataFrame到NumPy数组
  8. arr_from_df = df_from_numpy.values
  9. print("从DataFrame创建NumPy数组:")
  10. print(arr_from_df)
  11. # 与Matplotlib集成
  12. # 使用Pandas内置的绘图功能
  13. df_plot = pd.DataFrame({
  14.     'A': np.random.randn(100).cumsum(),
  15.     'B': np.random.randn(100).cumsum()
  16. })
  17. df_plot.plot(figsize=(10, 6))
  18. plt.title('Pandas内置绘图')
  19. plt.show()
  20. # 使用Matplotlib直接绘图
  21. plt.figure(figsize=(10, 6))
  22. plt.plot(df_plot.index, df_plot['A'], label='A')
  23. plt.plot(df_plot.index, df_plot['B'], label='B')
  24. plt.title('Matplotlib直接绘图')
  25. plt.legend()
  26. plt.show()
  27. # 与Seaborn集成
  28. import seaborn as sns
  29. # 创建更复杂的数据
  30. df_seaborn = pd.DataFrame({
  31.     'x': np.random.randn(100),
  32.     'y': np.random.randn(100),
  33.     'category': np.random.choice(['A', 'B', 'C'], 100)
  34. })
  35. # 使用Seaborn绘图
  36. plt.figure(figsize=(10, 6))
  37. sns.scatterplot(data=df_seaborn, x='x', y='y', hue='category')
  38. plt.title('Seaborn散点图')
  39. plt.show()
  40. # 与Scikit-learn集成
  41. from sklearn.preprocessing import StandardScaler
  42. from sklearn.model_selection import train_test_split
  43. from sklearn.linear_model import LinearRegression
  44. from sklearn.metrics import mean_squared_error
  45. # 创建示例数据
  46. df_sklearn = pd.DataFrame({
  47.     'Feature1': np.random.randn(1000),
  48.     'Feature2': np.random.randn(1000),
  49.     'Feature3': np.random.randn(1000),
  50.     'Target': np.random.randn(1000)
  51. })
  52. # 分割数据集
  53. X = df_sklearn[['Feature1', 'Feature2', 'Feature3']]
  54. y = df_sklearn['Target']
  55. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  56. # 标准化数据
  57. scaler = StandardScaler()
  58. X_train_scaled = scaler.fit_transform(X_train)
  59. X_test_scaled = scaler.transform(X_test)
  60. # 训练模型
  61. model = LinearRegression()
  62. model.fit(X_train_scaled, y_train)
  63. # 预测
  64. y_pred = model.predict(X_test_scaled)
  65. # 评估模型
  66. mse = mean_squared_error(y_test, y_pred)
  67. print(f"均方误差: {mse:.4f}")
  68. # 将预测结果转换为DataFrame
  69. results = pd.DataFrame({
  70.     'Actual': y_test,
  71.     'Predicted': y_pred
  72. })
  73. print("预测结果:")
  74. print(results.head())
  75. # 与SQL集成
  76. from sqlalchemy import create_engine
  77. # 创建SQLite数据库
  78. engine = create_engine('sqlite:///:memory:')
  79. # 将DataFrame写入数据库
  80. df_sql = pd.DataFrame({
  81.     'Name': ['Alice', 'Bob', 'Charlie', 'David'],
  82.     'Age': [25, 30, 35, 40],
  83.     'City': ['New York', 'Los Angeles', 'Chicago', 'Houston']
  84. })
  85. df_sql.to_sql('people', engine, index=False)
  86. # 从数据库读取数据
  87. df_from_sql = pd.read_sql('SELECT * FROM people WHERE Age > 30', engine)
  88. print("从SQL查询读取的数据:")
  89. print(df_from_sql)
复制代码

实际案例分析

让我们通过一个实际的数据分析案例来综合运用Pandas的各种功能。
  1. # 假设我们有一个销售数据集,我们需要分析销售趋势、客户行为和产品表现
  2. # 创建示例数据
  3. np.random.seed(42)
  4. dates = pd.date_range(start='2022-01-01', end='2022-12-31')
  5. products = ['Product A', 'Product B', 'Product C', 'Product D']
  6. regions = ['North', 'South', 'East', 'West']
  7. customers = [f'Customer_{i}' for i in range(1, 101)]
  8. # 生成销售数据
  9. sales_data = []
  10. for _ in range(10000):
  11.     sales_data.append({
  12.         'Date': np.random.choice(dates),
  13.         'Product': np.random.choice(products),
  14.         'Region': np.random.choice(regions),
  15.         'Customer': np.random.choice(customers),
  16.         'Quantity': np.random.randint(1, 10),
  17.         'Unit_Price': np.random.uniform(10, 100),
  18.         'Discount': np.random.choice([0, 0.05, 0.1, 0.15])
  19.     })
  20. sales_df = pd.DataFrame(sales_data)
  21. # 计算总销售额
  22. sales_df['Total_Price'] = sales_df['Quantity'] * sales_df['Unit_Price'] * (1 - sales_df['Discount'])
  23. # 查看数据的基本信息
  24. print("销售数据的基本信息:")
  25. print(sales_df.info())
  26. # 查看数据的统计摘要
  27. print("\n销售数据的统计摘要:")
  28. print(sales_df.describe())
  29. # 数据清洗
  30. # 检查缺失值
  31. print("\n缺失值统计:")
  32. print(sales_df.isnull().sum())
  33. # 检查异常值
  34. print("\n异常值检查:")
  35. print(sales_df[sales_df['Unit_Price'] > sales_df['Unit_Price'].quantile(0.99)])
  36. # 分析销售趋势
  37. # 按月份汇总销售额
  38. sales_df['Month'] = sales_df['Date'].dt.to_period('M')
  39. monthly_sales = sales_df.groupby('Month')['Total_Price'].sum().reset_index()
  40. monthly_sales['Month'] = monthly_sales['Month'].dt.to_timestamp()
  41. # 可视化月度销售趋势
  42. plt.figure(figsize=(12, 6))
  43. plt.plot(monthly_sales['Month'], monthly_sales['Total_Price'])
  44. plt.title('Monthly Sales Trend')
  45. plt.xlabel('Month')
  46. plt.ylabel('Total Sales')
  47. plt.xticks(rotation=45)
  48. plt.grid(True)
  49. plt.show()
  50. # 分析产品表现
  51. product_sales = sales_df.groupby('Product').agg({
  52.     'Total_Price': 'sum',
  53.     'Quantity': 'sum',
  54.     'Customer': 'nunique'  # 唯一客户数
  55. }).reset_index()
  56. product_sales.columns = ['Product', 'Total_Sales', 'Total_Quantity', 'Unique_Customers']
  57. product_sales['Average_Order_Value'] = product_sales['Total_Sales'] / product_sales['Total_Quantity']
  58. print("\n产品表现分析:")
  59. print(product_sales)
  60. # 可视化产品销售
  61. plt.figure(figsize=(12, 6))
  62. plt.bar(product_sales['Product'], product_sales['Total_Sales'])
  63. plt.title('Sales by Product')
  64. plt.xlabel('Product')
  65. plt.ylabel('Total Sales')
  66. plt.show()
  67. # 分析地区表现
  68. region_sales = sales_df.groupby('Region').agg({
  69.     'Total_Price': 'sum',
  70.     'Quantity': 'sum',
  71.     'Customer': 'nunique'
  72. }).reset_index()
  73. region_sales.columns = ['Region', 'Total_Sales', 'Total_Quantity', 'Unique_Customers']
  74. region_sales['Average_Order_Value'] = region_sales['Total_Sales'] / region_sales['Total_Quantity']
  75. print("\n地区表现分析:")
  76. print(region_sales)
  77. # 可视化地区销售
  78. plt.figure(figsize=(12, 6))
  79. plt.pie(region_sales['Total_Sales'], labels=region_sales['Region'], autopct='%1.1f%%')
  80. plt.title('Sales Distribution by Region')
  81. plt.show()
  82. # 分析客户行为
  83. customer_sales = sales_df.groupby('Customer').agg({
  84.     'Total_Price': 'sum',
  85.     'Quantity': 'sum',
  86.     'Product': 'nunique',
  87.     'Date': ['min', 'max']
  88. }).reset_index()
  89. customer_sales.columns = ['Customer', 'Total_Sales', 'Total_Quantity', 'Unique_Products', 'First_Purchase', 'Last_Purchase']
  90. # 计算客户活跃天数
  91. customer_sales['Active_Days'] = (customer_sales['Last_Purchase'] - customer_sales['First_Purchase']).dt.days + 1
  92. # 计算平均购买频率
  93. customer_sales['Average_Purchase_Frequency'] = customer_sales['Total_Quantity'] / customer_sales['Active_Days']
  94. print("\n客户行为分析 (前10名客户):")
  95. print(customer_sales.sort_values('Total_Sales', ascending=False).head(10))
  96. # 可视化客户分布
  97. plt.figure(figsize=(12, 6))
  98. plt.hist(customer_sales['Total_Sales'], bins=20)
  99. plt.title('Customer Sales Distribution')
  100. plt.xlabel('Total Sales')
  101. plt.ylabel('Number of Customers')
  102. plt.show()
  103. # 分析产品-地区组合
  104. product_region = sales_df.pivot_table(
  105.     values='Total_Price',
  106.     index='Product',
  107.     columns='Region',
  108.     aggfunc='sum'
  109. )
  110. print("\n产品-地区销售矩阵:")
  111. print(product_region)
  112. # 可视化产品-地区热力图
  113. plt.figure(figsize=(10, 8))
  114. sns.heatmap(product_region, annot=True, fmt='.0f', cmap='YlGnBu')
  115. plt.title('Product-Region Sales Heatmap')
  116. plt.show()
  117. # 时间序列分析
  118. # 按周汇总销售额
  119. weekly_sales = sales_df.set_index('Date').resample('W')['Total_Price'].sum()
  120. # 计算4周滚动平均
  121. weekly_sales_rolling = weekly_sales.rolling(window=4).mean()
  122. # 可视化周销售额和滚动平均
  123. plt.figure(figsize=(12, 6))
  124. plt.plot(weekly_sales.index, weekly_sales, label='Weekly Sales')
  125. plt.plot(weekly_sales_rolling.index, weekly_sales_rolling, label='4-Week Rolling Average')
  126. plt.title('Weekly Sales with Rolling Average')
  127. plt.xlabel('Week')
  128. plt.ylabel('Total Sales')
  129. plt.legend()
  130. plt.grid(True)
  131. plt.show()
  132. # 预测未来销售额(简单移动平均法)
  133. last_4_weeks_avg = weekly_sales.tail(4).mean()
  134. print(f"\n基于过去4周平均销售额预测的下一周销售额: {last_4_weeks_avg:.2f}")
  135. # 结论和建议
  136. print("\n结论和建议:")
  137. print("1. 产品表现: Product A和Product B是销售额最高的产品,应继续重点关注。")
  138. print("2. 地区表现: North和West地区的销售额较高,可以考虑在这些地区增加营销投入。")
  139. print("3. 客户行为: 少数高价值客户贡献了大部分销售额,应实施客户忠诚度计划。")
  140. print("4. 销售趋势: 销售额在年底有上升趋势,可以提前备货以满足需求。")
  141. print("5. 产品-地区组合: Product A在North地区表现最好,可以考虑在该地区推广其他产品。")
复制代码

总结与展望

通过本指南,我们系统地学习了Pandas库的各个方面,从基础操作到高级应用。Pandas作为Python数据科学生态系统的核心组件,提供了强大而灵活的数据处理能力,使我们能够高效地进行数据清洗、转换、分析和可视化。

主要收获

1. 基础操作:我们学习了Pandas的核心数据结构Series和DataFrame,以及如何创建、查看和选择数据。这些是使用Pandas的基础。
2. 数据清洗和预处理:我们探讨了如何处理缺失值、转换数据类型、处理重复值和异常值。这些步骤对于确保数据质量和分析结果的准确性至关重要。
3. 数据操作和转换:我们学习了如何对数据进行排序、分组和聚合、合并和连接,以及创建数据透视表。这些操作使我们能够从不同角度探索数据。
4. 时间序列数据处理:我们掌握了如何创建、操作和分析时间序列数据,包括重采样和滚动窗口计算。这些技能对于分析时间相关数据非常有用。
5. 数据可视化:我们学习了如何使用Pandas进行基本和高级数据可视化,以更好地理解数据和展示分析结果。
6. 高级应用:我们探讨了性能优化技巧、与其他库的集成,以及通过实际案例综合运用Pandas的各种功能。

基础操作:我们学习了Pandas的核心数据结构Series和DataFrame,以及如何创建、查看和选择数据。这些是使用Pandas的基础。

数据清洗和预处理:我们探讨了如何处理缺失值、转换数据类型、处理重复值和异常值。这些步骤对于确保数据质量和分析结果的准确性至关重要。

数据操作和转换:我们学习了如何对数据进行排序、分组和聚合、合并和连接,以及创建数据透视表。这些操作使我们能够从不同角度探索数据。

时间序列数据处理:我们掌握了如何创建、操作和分析时间序列数据,包括重采样和滚动窗口计算。这些技能对于分析时间相关数据非常有用。

数据可视化:我们学习了如何使用Pandas进行基本和高级数据可视化,以更好地理解数据和展示分析结果。

高级应用:我们探讨了性能优化技巧、与其他库的集成,以及通过实际案例综合运用Pandas的各种功能。

未来学习方向

虽然本指南涵盖了Pandas的许多方面,但数据科学是一个不断发展的领域,还有许多值得探索的方向:

1. 大数据处理:当数据集太大而无法放入内存时,可以考虑使用Dask、Vaex或PySpark等工具。
2. 机器学习集成:深入学习如何将Pandas与Scikit-learn、TensorFlow或PyTorch等机器学习框架结合使用。
3. 自动化数据处理:学习如何使用Pandas构建自动化的数据处理管道,提高工作效率。
4. 高级统计分析:结合Statsmodels等库,进行更复杂的统计分析。
5. 交互式数据可视化:学习如何使用Plotly、Bokeh或Altair等库创建交互式可视化。

大数据处理:当数据集太大而无法放入内存时,可以考虑使用Dask、Vaex或PySpark等工具。

机器学习集成:深入学习如何将Pandas与Scikit-learn、TensorFlow或PyTorch等机器学习框架结合使用。

自动化数据处理:学习如何使用Pandas构建自动化的数据处理管道,提高工作效率。

高级统计分析:结合Statsmodels等库,进行更复杂的统计分析。

交互式数据可视化:学习如何使用Plotly、Bokeh或Altair等库创建交互式可视化。

结语

Pandas是一个功能强大、灵活且易于使用的数据分析工具。通过掌握Pandas,你将能够更高效地处理和分析数据,从而更好地理解数据背后的故事。无论你是数据分析师、数据科学家还是研究人员,Pandas都将成为你工具箱中不可或缺的一部分。

希望本指南能够帮助你从初学者成长为数据专家。记住,实践是最好的学习方法,所以请继续探索、实验和应用Pandas来解决实际问题。随着经验的积累,你将发现Pandas的更多可能性,并能够更自信地应对各种数据分析挑战。

祝你在数据科学的旅程中取得成功!
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则