Python 数据处理与分析之 Pandas 库

介绍

  • Pandas(Python Data Analysis Library)是一个流行的 Python 第三方库,是数据处理和数据分析中不可或缺的工具之一,用于数据处理和数据分析。
  • 它提供了高效的数据分析方法和灵活且高效的数据结构。相比于其他的数据处理库,pandas更适用于处理具有关系型数据或者带标签数据的情况,在时间序列分析方面也有着不错的表现。
  • 如果需要进行数据操作、清理、转换和分析,Pandas 通常是一个非常有用的工具。

核心数据类型

Series

  • Series :是 Pandas 中的一维数据结构,类似于一维数组或列表。

    Series 可以存储任何数据类型,并且每个元素都有一个与之关联的标签,称为索引。 索引有助于对数据进行标记和命名,使得数据的访问更加方便和直观。

    与传统的数组和列表不同,Pandas 的索引可以是任意数据类型,包括整数、字符串、日期等,不同元素的索引也可以是相同的。

    在创建一个 Series 时,可以通过指定索引来为每个元素进行命名,这样一来就可以通过索引来访问和操作这些元素。

    在访问 Series 中的元素时,同样需要使用索引来指定要访问的位置。

  • 创建 Series 对象:

    pandas.Series(data=None, index=None, dtype: Dtype = None, name=None, copy: bool=False, 
                  fastpath: bool = False)
    
    • data:指定 Series 中的数据,可以是列表、数组、字典、标量值等。必选参数

    • index:指定 Series 的索引,用于标识和访问数据。

      索引可以是列表、数组、范围对象、标量值或其他 Series

      如果没有显式指定索引,Pandas 将自动生成一个默认的整数索引

    • dtype:指定 Series 中数据的数据类型。如果不指定,Pandas 将尝试自动推断数据类型

    • name:指定 Series 的名称

    • copy:默认为 False。如果设置为 True,则会复制数据,而不是使用原始数据的引用。

  • 示例

    import pandas as pd
    import numpy as np
    
    # 创建Series(默认索引)
    data = pd.Series([1, np.nan, 6])
    # 创建Series(自建索引)
    data = pd.Series([1, np.nan, 6], index=[0, 3, 4])
    # 创建Series(通过字典直接创建带索引的数据)
    data = pd.Series({0: 1, 3: np.nan, 4: 6})
    print(data)
    
    # 输出结果
    0    1.0
    3    NaN
    4    6.0
    dtype: float64
    

DataFrame

  • DataFrame :是 Pandas 中的二维数据结构,类似于 Excel 表格或 SQL 表,由行和列组成,并且可以存储不同类型的数据。

    DataFrame 可以看做是一系列 Series 对象的集合,每个 Series 对象代表一列数据

    在 DataFrame 中,索引的作用更加重要。除了可以为每一行和每一列指定索引外,DataFrame 还支持多级索引,也就是可以为行和列同时指定多个索引。这为多维数据的处理提供了更多的灵活性和功能性。

    通过索引,可以轻松地从 DataFrame 中选择特定的行数和列数,可以通过指定行索引和列索引来选择任意子集的数据,也可以通过使用条件表达式来筛选满足特定条件的数据。

  • 创建 DataFrame 对象:

    pandas.DataFrame(data=None, index=None, dtype: Dtype = None, columns: Axes = None, copy: bool=False)
    
    • data:指定 Series 中的数据,可以是列表、数组、字典、标量值等。必选参数

    • index:指定 Series 的索引,用于标识和访问数据。

      索引可以是列表、数组、范围对象、标量值或其他 Series

      如果没有显式指定索引,Pandas 将自动生成一个默认的整数索引

    • dtype:指定 Series 中数据的数据类型。如果不指定,Pandas 将尝试自动推断数据类型

    • columns:指定 DataFrame 的列标签,用于标识和访问列。

      列标签可以是列表、数组、范围对象、标量值或其他 Series。

      如果没有显式指定列标签,Pandas 将自动生成默认的整数列标签。

    • copy:默认为 False。如果设置为 True,则会复制数据,而不是使用原始数据的引用。

  • 示例:

    import pandas as pd
     
    data = {'name': ['John', 'Emma', 'Mike', 'Lisa'],
            'age': [28, 24, 32, 35],
            'city': ['New York', 'London', 'Paris', 'Tokyo']}
    df1 = pd.DataFrame(data)
    
    # 通过columns指定DataFrame的列索引
    data = [[1,'Bob', 24, 'American'],[2, 'Nancy', 23, 'Australia'],[3, 'Lili', 22, 'China'],[4, 'Leo', 27, 'M78'],[5, 'David', 24, 'moon']]
    df2 = pd.DataFrame(data, columns=['serial', 'name', 'age', 'from',])
    
    # 自定义索引
    df3 = pd.DataFrame(data, columns=['serial', 'name', 'age', 'from'], index=['a','b','c','d','e'])
    
    # df1 输出结果
       name  age      city
    0  John   28  New York
    1  Emma   24    London
    2  Mike   32     Paris
    3  Lisa   35     Tokyo
    # df3 输出结果
       serial   name  age       from
    a       1    Bob   24   American
    b       2  Nancy   23  Australia
    c       3   Lili   22      China
    d       4    Leo   27        M78
    e       5  David   24       moon
    

常用函数和方法

数据导入和导出

Pandas 可以从多种数据源导入数据,包括 CSV、Excel、SQL 数据库、JSON 等,并且可以将数据导出到这些格式。

  • pandas.read_csv() :从 CSV 文件导入数据,返回一个 DataFrame 对象(df)

    参数说明:

    • filepath_or_buffer :CSV 文件路径或文件对象。
    • sep :可选,分隔符,默认为逗号
    • header :可选,指定哪一行作为列名,默认为第一行
    • index_col :可选,指定哪一列作为索引
  • pandas.read_excel() :从 Excel 文件导入数据,返回一个 DataFrame 对象(df)

    参数说明:

    • io :Excel 文件路径、文件对象或 URL
    • sheet_name :可选,工作表名称
    • header :可选,指定哪一行作为列名,默认为第一行
  • df.to_csv() :将数据导出为 CSV 文件

    参数说明:

    • path_or_buf :导出的文件路径或文件对象
    • sep :可选,分隔符,默认为逗号
    • index :可选,是否包含索引,默认为 True
  • df.to_excel() :将数据导出为 Excel 文件

    参数说明:

    • excel_writer :Excel 文件路径、文件对象或 ExcelWriter 对象
    • sheet_name :可选,工作表名称
    • index :可选,是否包含索引,默认为 True
  • 示例

    import pandas as pd
    # 从CSV文件导入数据
    df = pd.read_csv('data.csv')
    # 将数据导出到Excel文件
    df.to_excel('data.xlsx', index=False)
    

数据处理和转换

Pandas 提供了各种方法来处理缺失数据、重复数据、异常数据,以及进行数据变换、筛选和合并不同数据源的数据,包括连接、合并和联接等操作。

  • df.isnull()df.notnull() :检测缺失值

  • df.drop() :删除行或列

  • df.dropna() :删除包含缺失值的行

  • df.drop_duplicates() :删除重复行

  • df.fillna(value) :填充缺失值

  • df.apply(func) :应用函数到行或列

  • df.groupby(‘column_name’).mean() :分组数据(聚合)

  • df.pivot_table() :创建透视表

  • df.melt() :将宽格式数据转换为长格式

  • 示例

    # 聚合操作
    data = [[1,'Bob', 24, 'high-school'],[2, 'Nancy', 23, 'college'],[3, 'Lili', 22, 'college']]
    df = pd.DataFrame(data, columns=['serial', 'name', 'age', 'grade'], index=['a','b','c'])
    # 聚合,按grade分组,并计算分组后的平均年龄
    xdf = df.groupby('grade')['age'].mean()
    
    # 透视表
    pd.pivot_table(df, values='value_column', index='index_column', columns='column_to_pivot')
    # 应用自定义函数
    df.apply(custom_function, axis=1)
    

数据合并和拆分

  • pd.concat() :用于合并行(纵向堆叠)或列(横向连接)数据,通常用于连接不同数据集的行或列,但不执行基于列的合并,不对数据重复值进行检查或处理,只是简单地将数据堆叠在一起

    主要参数说明:

    • objs :要合并的数据对象列表,可以是 DataFrame 或 Series 的列表。唯一的必选参数

    • axis :指定合并的轴方向。默认为 0,表示按行合并(纵向堆叠),如果设置为 1,表示按列合并(横向连接)

    • join :指定连接的方式,默认为 'outer'。可以取以下值:

      • 'outer':执行外连接,保留所有的行或列,并使用缺失值填充不存在的数据。
      • 'inner':执行内连接,只保留共有的行或列。
    • ignore_index :默认为 False。如果设置为 True,将忽略原始索引,创建新的连续整数索引。

    • keys :用于创建层次化索引的标签,可以是字符串、列表或数组。如果提供了 keys,将创建 MultiIndex。

    **适用场景:**主要用于简单的数据堆叠操作,合并来自不同来源或处理方式的数据,如将多个相似的数据集按行堆叠在一起,或者将不同数据集的列拼接在一起

  • pd.merge() :用于基于列的合并,类似于 SQL 中的 JOIN 操作,用于将两个或多个数据框(DataFrame)根据一个或多个共享的列进行连接。

    pd.merge() 通常会检查连接列中是否有重复值,并根据连接类型执行不同的处理操作,如 INNER JOIN、LEFT JOIN、RIGHT JOIN 或 FULL JOIN。

    主要参数说明:

    • left:左侧的 DataFrame,用于合并的左侧数据。
    • right:右侧的 DataFrame,用于合并的右侧数据。
    • how:指定连接方式,默认为 'inner'。可以取以下值:
      • 'inner':执行内连接,只保留两个 DataFrame 中共有的行。
      • 'outer':执行外连接,保留两个 DataFrame 中的所有行,缺失值用 NaN 填充。
      • 'left':执行左连接,保留左侧 DataFrame 中的所有行,右侧 DataFrame 中没有匹配的行用 NaN 填充。
      • 'right':执行右连接,保留右侧 DataFrame 中的所有行,左侧 DataFrame 中没有匹配的行用 NaN 填充。
    • on:用于连接的列名(左右两侧 DataFrame 中具有相同名称的列)。可以是单个列名的字符串,或者是列名的列表(如果需要多列连接)。
    • left_on:左侧 DataFrame 中用于连接的列名,如果左右两侧的连接列名称不同,可以使用该参数指定左侧的列名。
    • right_on:右侧 DataFrame 中用于连接的列名,如果左右两侧的连接列名称不同,可以使用该参数指定右侧的列名。
    • left_index:默认为 False。如果设置为 True,则使用左侧 DataFrame 的索引作为连接键。
    • right_index:默认为 False。如果设置为 True,则使用右侧 DataFrame 的索引作为连接键。
    • suffixes:默认为 ('_x', '_y')。用于处理重叠列名的后缀字符串元组,可以指定在列名冲突时添加到列名末尾。
    • sort:默认为 False。如果设置为 True,在合并后对结果进行排序。
    • copy:默认为 True。如果设置为 False,尝试在不复制数据的情况下执行连接操作,可以提高性能。

    **适用场景:**主要用于更复杂的基于列的数据连接和合并操作,基于共享列合并来自不同数据集的数据,通常用于数据关联、数据连接和数据库风格的合并操作。

  • pd.join() :函数根据索引或列的值进行连接

  • df.split() :将包含多个值的单个列拆分成多个列,从而使数据更加规整和易于处理

  • 示例:

    # 合并两个DataFrame
    merged_df = pd.concat([df1, df2], axis=0)
    # 数据库风格的连接
    merged_df = pd.merge(df1, df2, on='key_column')
    

数据查看和概览

  • df.head(n) :查看 DataFrame 的前 n 行,默认为 5 行
  • df.tail(n) :查看 DataFrame 的后 n 行,默认为 5 行
  • df.info() :查看 DataFrame 的基本信息,包括数据类型和非空值数量
  • df.describe() :生成描述性统计信息,包括均值、标准差等

数据选择和检索

  • df[‘column_name’] :选择单列

  • df[[‘col1’, ‘col2’]] :选择多列

  • df.loc[row_label] :使用标签选择行

  • df.iloc[row_index] :使用整数索引选择行

  • df.query() :使用条件查询数据

  • 示例:

    # 选择列:可以使用列名或列索引来选择列。
    df['name']
    # 选择行:可以使用行索引来选择行。
    df.loc['a']
    # 切片方式访问。访问第二行到第三行数据
    df.iloc[1:3] 
    

数据筛选和过滤

  • df[df[‘column_name’] > value] :按条件筛选行

  • df[(condition1) & (condition2)] :使用逻辑运算符筛选行

  • 示例

    # 过滤行:可以使用条件表达式来过滤行。
    df[df['age'] > 30]
    

数据排序和排名

  • df.sort_values(‘column_name’) :按列值排序

  • df.sort_index() :按索引排序

  • df.rank() :为数据分配排名

  • 示例:

    df = df.sort_values(by='age', ascending=False)
    

时间序列处理

Pandas 对时间序列数据提供了强大的支持,包括日期解析、时间索引和滚动窗口操作。

  • pd.to_datetime(arg, format) :将字符串转换为日期时间类型

    • arg :日期时间字符串、时间戳、Series 等
    • format :可选,指定日期时间格式
  • df.resample() :重采样时间序列数据

  • df.shift(periods, freq) :平移时间序列数据

  • 示例:

    # 解析日期列
    df['date_column'] = pd.to_datetime(df['date_column'])
    # 创建时间索引
    df.set_index('date_column', inplace=True)
    # 滚动窗口操作
    df['rolling_mean'] = df['value_column'].rolling(window=3).mean()
    

数据可视化

Pandas 整合了 Matplotlib 库,可以轻松地可视化数据。

  • df.plot() :绘制数据可视化图表

    • 可以通过参数指定图表类型(例如,‘line’、‘bar’、‘scatter’ 等)和其他绘图选项
  • df.hist() :绘制直方图

    • 可以通过参数指定直方图的柱数、颜色等
  • df.boxplot() :绘制箱线图

    • 可以通过参数指定是否显示
  • 示例:

    import matplotlib.pyplot as plt
    # 创建柱状图
    df['column_name'].plot(kind='bar')
    # 创建散点图
    df.plot.scatter(x='x_column', y='y_column')
    # 更多的可视化选项可以结合使用 Pandas 和 Matplotlib
    

高级用法

多级索引

  • Pandas 的多级索引功能非常强大,它允许在一个 DataFrame 中创建复杂的层次结构索引,从而更灵活地组织和分析数据。

    一个常见的应用场景是使用多级索引来表示时间序列数据,比如将年份和季度作为索引的两个层级。

  • 通过创建多级索引,可以将数据按照不同的层级进行划分和聚合。

    例如,可以根据年份来对数据进行分组,然后在每个年份内再按照季度进行分组。这样,可以更方便地进行各种统计分析,比如计算每个季度的平均值、总和等。

  • 在创建多级索引时,可以使用 Pandas 的 MultiIndex 类来指定索引的层级和标签。

    通过指定层级的名称和对应的标签值,可以轻松地创建一个具有多级索引的 DataFrame。

  • 使用多级索引可以带来很多好处,比如提高数据的查询效率、简化数据的操作和分析等。

    但同时,也需要注意在使用多级索引时,要避免索引混淆和数据结构复杂度过高的问题。

    因此,在使用多级索引时,需要根据具体的需求和数据特点来灵活应用。

  • 示例:

    import pandas as pd
     
    # 创建多级索引
    index = pd.MultiIndex.from_tuples([('2019', 'Q1'), ('2019', 'Q2'), ('2020', 'Q1'), ('2020', 'Q2')])
    data = pd.DataFrame({'Sales': [100, 200, 150, 250]}, index=index)
    # 查询特定季度的销售数据
    print(data.loc[('2020', 'Q1')])
    print("==================")
    # 查询特定年份的销售数据
    print(data.loc['2020'])
    
    # 输出结果:
    Sales    150
    Name: (2020, Q1), dtype: int64
    ==================
        Sales
    Q1    150
    Q2    250
    

透视表

  • 透视表是一种根据数据中的一个或多个列创建汇总表格的方法。

    Pandas 提供了 pivot_table() 函数,可以方便地对数据进行聚合和分析。

    通过 pivot_table() 函数,可以指定一个或多个列作为行索引,另一个或多个列作为列索引,然后根据指定的聚合函数对数据进行汇总。这样,就可以快速计算出各个行和列对应的统计量,比如平均值、总和、计数等。

  • Pandas 的透视表功能提供了一种方便、灵活的数据聚合和分析方法,可以帮助更好地理解和利用数据。

    透视表的好处在于它提供了一种直观、简洁的方式来查看和分析数据。

    通过透视表,可以轻松地对数据进行切片、切块和筛选,从而更深入地了解数据的特征和关系。

  • 使用透视表时,可以根据具体的需求选择合适的聚合函数、行列索引和筛选条件,以获取想要的分析结果。

    透视表不仅适用于单个 DataFrame,还可以用于多个 DataFrame 的合并和分析。

  • 示例:

    import pandas as pd
     
    # 创建一个包含销售数据的DataFrame
    data = pd.DataFrame({'Year': ['2019', '2019', '2020', '2020'],
                         'Quarter': ['Q1', 'Q2', 'Q1', 'Q2'],
                         'Product': ['A', 'B', 'A', 'B'],
                         'Sales': [100, 200, 150, 250]})
    # 创建透视表
    pivot_table = data.pivot_table(index='Year', columns='Quarter', values='Sales', aggfunc='sum')
    # 打印透视表
    print(pivot_table)
    
    # 输出结果
    Quarter   Q1   Q2
    Year
    2019     100  200
    2020     150  250
    

时间序列分析

  • 在处理时间序列数据方面,Pandas 提供了灵活且高效的功能。

    它的日期和时间处理功能包括日期范围生成、日期索引、日期加减运算、日期格式化等。可以轻松地创建日期范围,并使用这些日期作为数据的索引,便于对时间序列数据进行操作和分析。

  • Pandas 还支持重采样操作,可以将时间序列数据从一个频率转换为另一个频率。

    例如,可以将按天采样的数据转换为按月采样的数据,或者将按小时采样的数据转换为按分钟采样的数据。重采样功能允许根据需要灵活地调整数据的粒度和频率。

  • Pandas 还提供了滑动窗口操作,可以在时间序列数据上执行滑动窗口统计计算。

    可以定义窗口的大小和滑动的步长,并针对窗口内的数据进行汇总、聚合或其他计算操作。这对于处理时间序列数据中的移动平均值、滚动求和等任务非常有用。

  • 示例:

    import pandas as pd
     
    # 创建一个包含时间序列数据的DataFrame
    df = pd.DataFrame({'Date': pd.date_range(start='2020-01-01', periods=10),
                       'Sales': [100, 200, 150, 250, 180, 120, 300, 350, 400, 250]})
     
    # 将日期列设置为索引
    df.set_index('Date', inplace=True)
    # 计算每周销售总额
    weekly_sales = df.resample('W').sum()
    # 打印每周销售总额
    print(weekly_sales)
    

处理 Excel 文件

  • 当使用 Pandas 处理 Excel 文件时,可以使用 read_excel() 函数来读取 Excel 数据,并将其加载到一个 DataFrame 中。

    然后可以对读取的数据进行各种操作和处理,例如筛选特定列的数据、根据条件筛选数据、对数据进行排序,在 DataFrame 中添加了新的列等等。

  • 示例:

    import pandas as pd
     
    # 读取Excel文件
    df = pd.read_excel('data.xlsx', sheet_name='Sheet1')
     
    # 显示DataFrame的前几行数据
    print(df.head())
    
    # 筛选特定列数据
    selected_columns = ['Name', 'Age']
    filtered_data = df[selected_columns]
     
    # 按条件筛选数据
    condition = df['Age'] > 25
    filtered_data = df[condition]
     
    # 数据排序
    sorted_data = df.sort_values(by='Age', ascending=False)
     
    # 添加新列
    df['Gender'] = ['Male', 'Female', 'Male', 'Female', 'Male']
     
    # 写入到新的Excel文件
    df.to_excel('new_data.xlsx', index=False)
    

你可能感兴趣的:(Python,python,pandas,开发语言)