返回博客列表

DataFrame权威指南:从入门到精通Python数据分析基石

全面介绍pandas DataFrame的核心概念、基础操作和高级应用,帮助开发者掌握Python数据分析的基础工具。

2025-01-269 分钟阅读Yaron
#Python#pandas#DataFrame#数据处理#Python3.8+

引言:什么是DataFrame?

想象一下,如果 Excel 电子表格拥有了编程的超能力,会是什么样子?这,就是 DataFrame
DataFrame 是 Python 数据分析库 pandas 中的核心数据结构。它是一个二维的、可变大小的、支持异构数据(即每列数据类型可以不同)的表格型结构。简单来说,它就是一个带有标签的行和列的表格,是处理结构化数据的最强大工具之一。
一个 DataFrame 由三个主要部分构成:

  1. 数据 (Data):表格中存储的实际值。
  2. 行索引 (Index):每一行的唯一标识(标签),类似于 Excel 的行号。
  3. 列索引 (Columns):每一列的唯一标识(标签),即列名。

直观示意图:

      <-- 列 (Columns) -->  
      name      age   city  
<--+------------------------  
行 | 0  Alice     25    New York  
索 | 1  Bob       30    Los Angeles  
引 | 2  Charlie   35    Chicago  
   +------------------------

核心特性:为什么选择DataFrame?

  • 直观的表格结构:以清晰的行列形式组织数据,易于理解。
  • 强大的数据类型支持:每列可独立存储字符串、整数、浮点数、日期等不同类型的数据。
  • 灵活的大小可变性:可以轻松地添加或删除行和列。
  • 智能的索引系统:支持通过标签 (.loc) 和整数位置 (.iloc) 进行复杂的数据切片和筛选。
  • 自动数据对齐:在进行数学运算时,能自动按行列索引对齐数据,避免了手动对齐的繁琐和错误。
  • 优雅地处理缺失值:使用 NaN (Not a Number) 表示缺失数据,并提供了一整套方便的填充、删除或插值方法。
  • 一站式数据处理:内置了分组聚合、合并连接、数据重塑等高级数据处理功能,无需借助其他工具。

创建DataFrame:多种数据源的转换

在开始之前,请确保已导入 pandas 库:
import pandas as pd

1. 从字典创建 (最常用)

这是最直接、最常见的方式。字典的键成为列名,值为该列的数据列表。

data = {  
    'name': ['Alice', 'Bob', 'Charlie', 'David'],  
    'age': [25, 30, 35, 28],  
    'city': ['New York', 'Los Angeles', 'Chicago', 'Houston']  
}  
df = pd.DataFrame(data)

2. 从列表的列表创建

如果你有一组数据行,可以用这种方式创建,并手动指定列名。

rows = [  
    ['Alice', 25, 'New York'],  
    ['Bob', 30, 'Los Angeles'],  
    ['Charlie', 35, 'Chicago']  
]  
columns = ['name', 'age', 'city']  
df_from_rows = pd.DataFrame(rows, columns=columns)

3. 从外部文件读取 (数据分析的起点)

这是 pandas 最强大的功能之一,能够用一行代码将整个 CSV 或 Excel 文件读入 DataFrame。

# 读取 CSV 文件  
# df_from_csv = pd.read_csv('your_data.csv')

# 读取 Excel 文件  
# df_from_excel = pd.read_excel('your_data.xlsx', sheet_name='Sheet1')

基础操作:DataFrame的“增删改查”

以下操作都基于我们从字典创建的 df。

查(一):概览与检查数据

  • df.head(n): 查看前 n 行数据(默认为 5),快速了解数据结构。
  • df.tail(n): 查看后 n 行数据(默认为 5)。
  • df.info(): 查看 DataFrame 的摘要信息,包括索引、列、数据类型、非空值数量和内存占用。这是数据检查的第一步!
  • df.describe(): 对所有数值类型的列进行描述性统计(计数、均值、标准差、最小值、四分位数、最大值)。
  • df.shape: 返回一个元组,表示 DataFrame 的维度 (行数, 列数)。
  • df.columns: 查看所有列名。
  • df.index: 查看所有行索引。

查(二):精准数据选取

  • 选取列

    # 选取单列,返回一个 Series 对象  
    ages = df['age']
    
    # 选取多列,返回一个新的 DataFrame  
    subset = df[['name', 'city']]
    
  • 使用 .loc 按标签选取行和列

    # 选取索引标签为 0 的行  
    row_0 = df.loc[0]
    
    # 选取索引标签为 0 和 2 的行  
    rows_0_2 = df.loc[[0, 2]]
    
    # 选取第 0 行的 'name' 和 'city' 列  
    alice_info = df.loc[0, ['name', 'city']]
    
  • 使用 .iloc 按整数位置选取行和列

    # 选取第一行 (整数位置为 0) 
    row_0 = df.iloc[0]
    
    # 选取前两行  
    first_two_rows = df.iloc[0:2]
    
    # 选取第一行、第一列的元素  
    first_element = df.iloc[0, 0] # -> 'Alice'
    
  • 条件筛选(布尔索引)- 最强大、最常用的方式

    # 选取所有年龄大于 28 岁的行  
    df_older_than_28 = df[df['age'] > 28]
    
    # 选取所有居住在芝加哥且年龄大于30岁的人  
    chicago_senior = df[(df['city'] == 'Chicago') & (df['age'] > 30)]
    

增与改:添加和修改数据

  • 添加新列

    # 添加一个所有值都相同的列  
    df['country'] = 'USA'
    
    # 基于现有列计算新列  
    df['age_in_10_years'] = df['age'] + 10
    
  • 修改数据 使用 .loc 或 .iloc 定位到元素并重新赋值。

    # 将 Alice 的城市修改为 Boston  
    df.loc[0, 'city'] = 'Boston'
    
    # 将所有年龄大于30岁的人的国家改为 'United States'  
    df.loc[df['age'] > 30, 'country'] = 'United States'
    

删:移除数据

使用 .drop() 方法。它默认返回一个新 DataFrame,不修改原始数据。

# 删除 'age_in_10_years' 列  
# axis=1 表示操作对象是列  
df_after_drop_col = df.drop('age_in_10_years', axis=1)


# 删除索引为 3 的行  
# axis=0 表示操作对象是行(默认值)  
df_after_drop_row = df.drop(3, axis=0)

# 如果想在原始 DataFrame 上直接修改,使用 inplace=True  
# df.drop(3, axis=0, inplace=True)

进阶之路:数据分析的核心操作

掌握了基础操作后,DataFrame 更强大的功能在于其分析能力:

  • 分组聚合 (.groupby()): 类似于 SQL 的 GROUP BY,是数据分析的基石。可以按一个或多个列对数据进行分组,然后对每个组应用聚合函数(如 sum, mean, count, max 等)。

    按城市计算平均年龄

    avg_age_by_city = df.groupby('city')['age'].mean()
    
  • 合并与连接 (.merge(), .concat()): 像 SQL 的 JOIN 一样,可以将多个 DataFrame 按照指定的键或规则横向或纵向地合并在一起,是整合不同来源数据的关键。

结语

DataFrame 是使用 Python 进行数据分析的绝对基石。 它将 Python 语言的灵活性与传统数据库的强大数据处理能力完美结合。无论您是进行数据清洗、探索性分析、特征工程还是数据可视化,一切工作都将围绕 DataFrame 展开。熟练掌握它,就等于拿到了开启数据科学大门的钥匙。