- 基础算术运算
- 比较运算
- 聚合运算
- 分组运算
- 应用自定义函数
- 处理缺失值
准备工作:创建一个示例 DataFrame
为了方便演示,我们先创建一个 DataFrame。

import pandas as pd
import numpy as np
# 创建一个示例 DataFrame
data = {
'A': [1, 2, 3, 4, 5],
'B': [10, 20, 30, 40, 50],
'C': [100, 200, 300, 400, 500]
}
df = pd.DataFrame(data)
# 创建一个带缺失值的 DataFrame
df_with_nan = pd.DataFrame({
'A': [1, 2, np.nan, 4, 5],
'B': [10, np.nan, 30, 40, 50],
'C': [100, 200, 300, np.nan, 500]
})
print("原始 DataFrame:")
print(df)
print("\n带缺失值的 DataFrame:")
print(df_with_nan)
基础算术运算
Pandas DataFrame 支持所有标准的算术运算符:, , , , (整除), (取模), (幂)。
这些运算会按元素进行,也就是对 DataFrame 中的每一个数都执行相应的运算。
示例:对整个 DataFrame 进行运算
# 所有元素都加 10 print(df + 10) # 所有元素都乘以 2 print(df * 2) # 计算 A 列的平方 print(df['A'] ** 2)
示例:DataFrame 之间的运算
当两个 DataFrame 进行运算时,Pandas 会根据列名和索引对齐元素,然后进行运算。
# 创建另一个 DataFrame
df2 = pd.DataFrame({
'A': [10, 20, 30, 40, 50],
'B': [1, 2, 3, 4, 5],
'D': [5, 4, 3, 2, 1] # 注意,这个列在 df 中不存在
})
print("\nDataFrame df2:")
print(df2)
# df 和 df2 相加
# 只有 A, B 两列有共同的列名,可以进行运算
# D 列因为只在 df2 中存在,结果为 NaN
# 索引不匹配的位置也会是 NaN
print("\ndf + df2:")
print(df + df2)
示例:列与列之间的运算
你可以直接使用列名进行运算,结果会是一个新的 Series。

# 计算列 A 和列 B 的和
df['A_plus_B'] = df['A'] + df['B']
print("\n新增 A_plus_B 列:")
print(df)
# 计算列 C 除以列 A
df['C_div_A'] = df['C'] / df['A']
print("\n新增 C_div_A 列:")
print(df)
比较运算
比较运算符(>, <, >=, <=, , )也同样是按元素进行的,返回一个由布尔值 True 和 False 组成的新 DataFrame 或 Series。
这在数据筛选中非常有用。
# 找出 A 列中大于 2 的所有行
print(df['A'] > 2)
# 筛选出 A 列大于 2 且 B 列大于 25 的行
# 注意:括号内的每个条件都必须用括号括起来
filtered_df = df[(df['A'] > 2) & (df['B'] > 25)]
print("\n筛选结果 (A > 2 且 B > 25):")
print(filtered_df)
# | 是 "或" 运算, & 是 "与" 运算, ~ 是 "非" 运算
# 找出 A 列小于等于 2 或者 C 列大于 400 的行
filtered_df_or = df[(df['A'] <= 2) | (df['C'] > 400)]
print("\n筛选结果 (A <= 2 或 C > 400):")
print(filtered_df_or)
聚合运算
聚合运算是指对一列或多列数据进行计算,得到一个单一的汇总值(如求和、平均值等)。
Pandas 提供了 .sum(), .mean(), .median(), .min(), .max(), .std(), .var(), .count() 等方法。

示例:对列进行聚合
# 计算每列的和
print("每列的和:")
print(df.sum())
# 计算每列的平均值
print("\n每列的平均值:")
print(df.mean())
# 计算某一列的最大值
print("\nA 列的最大值:")
print(df['A'].max())
示例:对行进行聚合
通过设置 axis=1,可以按行进行聚合。
# 计算每行的和
print("每行的和:")
print(df.sum(axis=1))
# 计算每行的平均值
print("\n每行的平均值:")
print(df.mean(axis=1))
分组运算
分组运算是数据分析中非常核心的功能,通常遵循 "Split-Apply-Combine"(拆分-应用-合并)的模式。
- Split (拆分): 根据一个或多个键将数据拆分成若干组。
- Apply (应用): 对每个组独立地应用一个函数(如聚合、转换、过滤)。
- Combine (合并): 将各组的运算结果合并成一个输出对象。
主要使用 .groupby() 方法。
示例:单列分组
假设我们有一个包含 'Category' 列的 DataFrame。
# 创建一个带分类的 DataFrame
sales_data = {
'Category': ['A', 'B', 'A', 'B', 'A', 'C'],
'Sales': [100, 150, 200, 50, 300, 120]
}
sales_df = pd.DataFrame(sales_data)
# 按 'Category' 分组,并计算每个分组的销售额总和
# 1. Split: 按 'Category' 列拆分数据
# 2. Apply: 对每个分组应用 sum() 函数
# 3. Combine: 将结果合并成一个 Series
category_sales = sales_df.groupby('Category')['Sales'].sum()
print("按类别分组的销售额总和:")
print(category_sales)
示例:多列分组
# 创建一个更复杂的 DataFrame
multi_group_data = {
'Region': ['East', 'West', 'East', 'West', 'East', 'West'],
'Category': ['A', 'A', 'B', 'B', 'A', 'B'],
'Sales': [100, 150, 200, 50, 300, 120]
}
multi_df = pd.DataFrame(multi_group_data)
# 按 'Region' 和 'Category' 分组,计算销售额总和
# 结果是一个多级索引的 Series
multi_group_sales = multi_df.groupby(['Region', 'Category'])['Sales'].sum()
print("\n按地区和类别分组的销售额总和:")
print(multi_group_sales)
应用自定义函数
当内置函数无法满足你的需求时,可以使用 .apply() 方法将一个自定义函数应用到 DataFrame 的列(axis=0,默认)或行(axis=1)上。
示例:应用到列
# 定义一个自定义函数
def multiply_by_10(x):
"""将输入值乘以 10"""
return x * 10
# 将函数应用到整个 DataFrame (默认 axis=0, 按列应用)
# 注意:apply 是按列操作的,x 会是每一列
# 这个例子不太符合直觉,我们看下面的例子
# print(df.apply(multiply_by_10)) # 这会报错,因为 x 是一个 Series
# 更常见的用法是应用到某一列
df['A_times_10'] = df['A'].apply(multiply_by_10)
print("\nA 列应用自定义函数后的结果:")
print(df[['A', 'A_times_10']])
示例:应用到行
axis=1 表示对每一行进行操作,x 代表该行的数据(一个 Series)。
# 定义一个处理行的函数
def row_sum_minus_min(row):
"""计算行的和减去行的最小值"""
return row.sum() - row.min()
# 将函数应用到每一行
# axis=1 表示按行应用
df['row_sum_minus_min'] = df.apply(row_sum_minus_min, axis=1)
print("\n对每一行应用自定义函数后的结果:")
print(df)
处理缺失值
在运算中,任何与 NaN (Not a Number) 进行的运算,结果通常都是 NaN,Pandas 提供了处理这种情况的方法。
.fillna(): 填充缺失值。.dropna(): 删除包含缺失值的行或列。
示例:填充缺失值后再运算
# 填充缺失值为 0,然后再求和
sum_filled_with_zero = df_with_nan.fillna(0).sum()
print("\n用 0 填充缺失值后每列的和:")
print(sum_filled_with_zero)
# 用该列的平均值填充缺失值
mean_A = df_with_nan['A'].mean()
df_filled_with_mean = df_with_nan.fillna({'A': mean_A, 'B': df_with_nan['B'].mean(), 'C': df_with_nan['C'].mean()})
print("\n用各列平均值填充缺失值后的 DataFrame:")
print(df_filled_with_mean)
示例:忽略缺失值进行运算
Pandas 的聚合函数(如 .sum(), .mean())默认会忽略 NaN 值。
# 直接计算带缺失值的列的和,NaN 会被自动忽略
sum_ignoring_nan = df_with_nan.sum()
print("\n忽略 NaN 值后每列的和:")
print(sum_ignoring_nan)
| 运算类型 | 主要方法/符号 | 描述 | 示例 |
|---|---|---|---|
| 算术运算 | , , , , | 对 DataFrame 或 Series 中的每个元素进行计算。 | df * 2, df['A'] + df['B'] |
| 比较运算 | >, <, , , &, |
生成布尔值,用于数据筛选。 | df[df['A'] > 2] |
| 聚合运算 | .sum(), .mean(), .max() |
对列或行进行汇总计算。 | df.sum(axis=0) |
| 分组运算 | .groupby() |
按 "Split-Apply-Combine" 模式进行复杂分析。 | df.groupby('key').value_counts() |
| 应用函数 | .apply() |
将自定义函数应用到列或行。 | df.apply(my_func, axis=1) |
| 处理缺失值 | .fillna(), .dropna() |
在运算前处理 NaN 值。 |
df.fillna(0).sum() |
掌握这些 DataFrame 的运算方法,你就可以高效地完成绝大多数的数据清洗、转换和分析任务。
