Pandas DataFrame:Python数据分析的核心 – wiki基地

Pandas DataFrame:Python数据分析的核心

Pandas,作为Python生态系统中最重要的数据分析库之一,因其强大的数据结构和灵活的数据处理工具而备受青睐。在Pandas的众多特性中,DataFrame无疑是最核心、最常用的数据结构。它提供了一种表格型的数据表示方式,能够以行和列的形式组织数据,类似于关系型数据库中的表或者Excel表格。本文将深入探讨Pandas DataFrame的各个方面,包括其定义、创建、属性、索引、选择、数据清洗、数据转换、数据聚合、以及与其他Python库的集成,旨在帮助读者全面理解并熟练运用DataFrame进行数据分析。

一、DataFrame的定义与特点

DataFrame是Pandas库中的二维标记(labeled)数据结构,其特点可以概括为以下几点:

  • 二维结构: DataFrame数据以表格形式存储,拥有行和列,类似于电子表格或SQL表。
  • 标记化: DataFrame的行和列都拥有标签(labels),也被称为索引(index)和列名(column names)。这些标签使得数据的访问和操作更加方便和直观。
  • 异构数据类型: DataFrame的每一列可以包含不同的数据类型,例如数值型、字符串型、日期型等。这与NumPy数组只能包含同一种数据类型形成了鲜明对比。
  • 大小可变: 可以方便地向DataFrame中添加或删除行和列。
  • 强大的数据处理能力: DataFrame提供了丰富的数据处理函数,可以进行数据清洗、转换、聚合、筛选等操作。
  • 缺失值处理: 提供了便捷的缺失值(NaN)处理机制,例如填充、删除等。

二、DataFrame的创建

Pandas提供了多种方式来创建DataFrame,常见的包括:

  1. 从字典创建:

    字典的键作为列名,字典的值作为列的数据。

    “`python
    import pandas as pd

    data = {‘Name’: [‘Alice’, ‘Bob’, ‘Charlie’],
    ‘Age’: [25, 30, 28],
    ‘City’: [‘New York’, ‘London’, ‘Paris’]}
    df = pd.DataFrame(data)
    print(df)
    “`

    输出:

    Name Age City
    0 Alice 25 New York
    1 Bob 30 London
    2 Charlie 28 Paris

  2. 从列表创建:

    列表中的每个元素作为一行数据,需要指定列名。

    python
    data = [['Alice', 25, 'New York'],
    ['Bob', 30, 'London'],
    ['Charlie', 28, 'Paris']]
    df = pd.DataFrame(data, columns=['Name', 'Age', 'City'])
    print(df)

    输出:

    Name Age City
    0 Alice 25 New York
    1 Bob 30 London
    2 Charlie 28 Paris

  3. 从NumPy数组创建:

    可以将NumPy数组转换为DataFrame,需要指定列名。

    “`python
    import numpy as np

    data = np.array([[‘Alice’, 25, ‘New York’],
    [‘Bob’, 30, ‘London’],
    [‘Charlie’, 28, ‘Paris’]])
    df = pd.DataFrame(data, columns=[‘Name’, ‘Age’, ‘City’])
    print(df)
    “`

    输出:

    Name Age City
    0 Alice 25 New York
    1 Bob 30 London
    2 Charlie 28 Paris

  4. 从CSV文件读取:

    这是最常用的方法,可以从CSV文件中读取数据创建DataFrame。

    python
    df = pd.read_csv('data.csv') # 假设data.csv存在,且有表头
    print(df)

  5. 从Excel文件读取:

    可以从Excel文件中读取数据创建DataFrame。

    python
    df = pd.read_excel('data.xlsx')
    print(df)

三、DataFrame的属性

DataFrame拥有多个属性,可以获取DataFrame的各种信息:

  • index 返回DataFrame的行索引。
  • columns 返回DataFrame的列名。
  • values 返回DataFrame的数据,以NumPy数组的形式。
  • dtypes 返回DataFrame每列的数据类型。
  • shape 返回DataFrame的形状,即(行数, 列数)。
  • size 返回DataFrame中元素的总个数。
  • ndim 返回DataFrame的维度,DataFrame是二维数据,所以ndim为2。
  • info() 提供DataFrame的简要信息,包括索引、列、非空值数量和数据类型。
  • describe() 生成DataFrame的描述性统计信息,包括计数、均值、标准差、最小值、最大值和四分位数。

四、DataFrame的索引与选择

DataFrame提供了多种方式来访问和选择数据:

  1. 使用方括号 []

    • 选择单列:df['Name'] 返回Series对象,代表Name列的所有数据。
    • 选择多列:df[['Name', 'Age']] 返回DataFrame对象,包含Name和Age两列的数据。
    • 使用切片选择行:df[0:3] 选择前三行数据。
  2. 使用.loc[]

    .loc[] 主要基于标签进行选择,更加直观和灵活。

    • 选择单行:df.loc[0] 返回Series对象,代表索引为0的行的数据。
    • 选择多行:df.loc[[0, 2]] 返回DataFrame对象,包含索引为0和2的行的数据。
    • 选择单列:df.loc[:, 'Name'] 返回Series对象,代表Name列的所有数据。
    • 选择多列:df.loc[:, ['Name', 'Age']] 返回DataFrame对象,包含Name和Age两列的数据。
    • 选择特定行和列:df.loc[[0, 2], ['Name', 'Age']] 返回DataFrame对象,包含索引为0和2的行,以及Name和Age两列的数据。
    • 使用布尔索引:df.loc[df['Age'] > 28, 'Name'] 返回年龄大于28岁的人的名字。
  3. 使用.iloc[]

    .iloc[] 主要基于整数索引进行选择,类似于NumPy数组的索引方式。

    • 选择单行:df.iloc[0] 返回Series对象,代表第一行的数据。
    • 选择多行:df.iloc[[0, 2]] 返回DataFrame对象,包含第一行和第三行的数据。
    • 选择单列:df.iloc[:, 0] 返回Series对象,代表第一列的数据。
    • 选择多列:df.iloc[:, [0, 1]] 返回DataFrame对象,包含第一列和第二列的数据。
    • 选择特定行和列:df.iloc[[0, 2], [0, 1]] 返回DataFrame对象,包含第一行和第三行,以及第一列和第二列的数据。
    • 使用布尔索引:df.iloc[(df['Age'] > 28).values, 0] 返回年龄大于28岁的人的名字,需要将布尔Series转换为NumPy数组。
  4. 使用.at[].iat[]

    .at[] 基于标签访问单个值,.iat[] 基于整数索引访问单个值,它们比.loc[].iloc[] 更快,但只能用于访问单个值。

    • df.at[0, 'Name'] 返回索引为0的行,Name列的值。
    • df.iat[0, 0] 返回第一行第一列的值。

五、DataFrame的数据清洗

数据清洗是数据分析过程中至关重要的一步,DataFrame提供了多种方法来处理缺失值、重复值和异常值:

  1. 处理缺失值:

    • isnull()notnull() 用于检测缺失值。
    • dropna() 用于删除包含缺失值的行或列。
      • df.dropna() 删除包含任何缺失值的行。
      • df.dropna(axis=1) 删除包含任何缺失值的列。
      • df.dropna(how='all') 删除所有值都为缺失值的行。
      • df.dropna(thresh=2) 删除至少包含2个非缺失值的行。
      • df.dropna(subset=['Name', 'Age']) 删除Name或Age列包含缺失值的行。
    • fillna() 用于填充缺失值。
      • df.fillna(0) 用0填充所有缺失值。
      • df.fillna(method='ffill') 用前一个非缺失值填充缺失值。
      • df.fillna(method='bfill') 用后一个非缺失值填充缺失值。
      • df.fillna({'Age': df['Age'].mean(), 'City': 'Unknown'}) 用Age列的均值填充Age列的缺失值,用’Unknown’填充City列的缺失值。
  2. 处理重复值:

    • duplicated() 用于检测重复值。
    • drop_duplicates() 用于删除重复值。
      • df.drop_duplicates() 删除所有列都相同的行。
      • df.drop_duplicates(subset=['Name', 'Age']) 删除Name和Age列都相同的行。
      • df.drop_duplicates(keep='first') 保留第一个出现的重复行。
      • df.drop_duplicates(keep='last') 保留最后一个出现的重复行。
      • df.drop_duplicates(inplace=True) 直接修改DataFrame,不返回新的DataFrame。
  3. 处理异常值:

    异常值的处理方法取决于具体情况,常见的包括:

    • 删除异常值: 可以使用布尔索引筛选出正常值。
    • 替换异常值: 可以使用均值、中位数或特定值替换异常值。
    • Winsorizing: 将极端值替换为更接近正常范围的值。

六、DataFrame的数据转换

DataFrame提供了丰富的数据转换函数,可以进行数据类型转换、字符串处理、日期时间处理等操作:

  1. 数据类型转换:

    • astype() 用于转换数据类型。
      • df['Age'] = df['Age'].astype('int64') 将Age列转换为整数类型。
      • df['City'] = df['City'].astype('category') 将City列转换为分类类型。
  2. 字符串处理:

    DataFrame的字符串列可以使用.str 属性访问字符串处理函数。

    • lower()upper() 转换为小写或大写。
    • strip() 去除字符串两端的空格。
    • split() 将字符串分割成列表。
    • replace() 替换字符串。
    • contains() 判断字符串是否包含某个子字符串。
    • startswith()endswith() 判断字符串是否以某个子字符串开头或结尾。
  3. 日期时间处理:

    DataFrame的日期时间列可以使用.dt 属性访问日期时间处理函数。

    • to_datetime() 将字符串转换为日期时间类型。
    • yearmonthdayhourminutesecond 提取日期时间的各个部分。
    • strftime() 将日期时间格式化为字符串。
    • date()time() 提取日期或时间部分。
  4. 新增列和删除列:

    • 新增列: 可以直接通过赋值的方式新增列。
      • df['Salary'] = df['Age'] * 10000 新增Salary列,值为Age列的值乘以10000。
    • 删除列: 可以使用del 语句或drop() 函数删除列。
      • del df['City'] 删除City列。
      • df.drop('City', axis=1) 删除City列。
      • df.drop(['Age', 'City'], axis=1) 删除Age和City列。

七、DataFrame的数据聚合

DataFrame提供了强大的数据聚合功能,可以对数据进行分组、统计和汇总:

  1. groupby()

    用于将DataFrame按照一列或多列进行分组。

    python
    grouped = df.groupby('City')

  2. 聚合函数:

    对分组后的数据应用聚合函数,常见的包括:

    • count() 计数。
    • sum() 求和。
    • mean() 求均值。
    • median() 求中位数。
    • min() 求最小值。
    • max() 求最大值。
    • std() 求标准差。
    • var() 求方差。

    python
    grouped_age_mean = df.groupby('City')['Age'].mean() # 计算每个城市年龄的平均值
    grouped_count = df.groupby('City').size() # 计算每个城市的人数

  3. agg()

    可以对分组后的数据应用多个聚合函数。

    python
    grouped_agg = df.groupby('City').agg({'Age': ['mean', 'median'], 'Salary': 'sum'})

  4. pivot_table()

    可以创建透视表,将数据按照行和列进行汇总。

    python
    pivot_table = pd.pivot_table(df, values='Salary', index='City', columns='Gender', aggfunc='sum')

八、DataFrame与其他Python库的集成

DataFrame可以与其他Python库进行无缝集成,例如:

  • NumPy: DataFrame底层基于NumPy数组实现,可以方便地与NumPy进行数据交互。
  • Matplotlib: 可以使用Matplotlib对DataFrame中的数据进行可视化。
  • Seaborn: 可以使用Seaborn进行更高级的数据可视化。
  • Scikit-learn: 可以使用Scikit-learn进行机器学习建模。

九、总结

Pandas DataFrame作为Python数据分析的核心,提供了强大的数据结构和丰富的数据处理工具。掌握DataFrame的创建、属性、索引、选择、数据清洗、数据转换、数据聚合以及与其他Python库的集成,是进行高效数据分析的关键。希望本文能够帮助读者全面理解并熟练运用DataFrame,从而更好地利用Python进行数据分析工作。 DataFrame的深入理解和灵活运用,能够极大地提高数据处理效率,并为后续的数据挖掘和机器学习奠定坚实的基础。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部