引言:什么是DataFrame?
想象一下,如果 Excel 电子表格拥有了编程的超能力,会是什么样子?这,就是 DataFrame。
DataFrame 是 Python 数据分析库 pandas 中的核心数据结构。它是一个二维的、可变大小的、支持异构数据(即每列数据类型可以不同)的表格型结构。简单来说,它就是一个带有标签的行和列的表格,是处理结构化数据的最强大工具之一。
一个 DataFrame 由三个主要部分构成:
- 数据 (Data):表格中存储的实际值。
- 行索引 (Index):每一行的唯一标识(标签),类似于 Excel 的行号。
- 列索引 (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 展开。熟练掌握它,就等于拿到了开启数据科学大门的钥匙。