核心方法
主要有两种方式进行 DataFrame 除法:

- 使用除法运算符 :这是最直观、最常用的方法。
- 使用
.divide()方法:功能与 类似,但可以提供更灵活的参数,axis和fill_value。
DataFrame 与标量(单个数字)相除
这是最简单的场景,DataFrame 中的每一个元素都会被同一个标量值除。
import pandas as pd
import numpy as np
# 创建一个示例 DataFrame
df = pd.DataFrame({
'A': [10, 20, 30],
'B': [100, 200, 300],
'C': [5, 15, 25]
}, index=['row1', 'row2', 'row3'])
print("原始 DataFrame:")
print(df)
输出:
原始 DataFrame:
A B C
row1 10 100 5
row2 20 200 15
row3 30 300 25
使用 运算符:
# 将 DataFrame 中的所有元素除以 10
result_div = df / 10
print("\nDataFrame 除以 10:")
print(result_div)
输出:

DataFrame 除以 10:
A B C
row1 1.0 10.0 0.5
row2 2.0 20.0 1.5
row3 3.0 30.0 2.5
使用 .divide() 方法:
# 效果与 df / 10 完全相同
result_div_method = df.divide(10)
print("\n使用 .divide() 方法除以 10:")
print(result_div_method)
DataFrame 与 Series 相除(广播)
这是 Pandas 最强大的功能之一,Pandas 会根据 Series 的索引或列名,将 Series 的值“广播”到整个 DataFrame 的相应行或列上。
情况 1:Series 的索引与 DataFrame 的列名对齐
在这种情况下,Series 的值会按列广播。
# 创建一个 Series,其索引与 DataFrame 的列名对齐
divisor_series_col = pd.Series([2, 5, 10], index=['A', 'B', 'C'])
print("\n除数 Series (按列广播):")
print(divisor_series_col)
# DataFrame 会被按列除
result_col = df / divisor_series_col
print("\nDataFrame 除以 Series (按列广播):")
print(result_col)
输出:

除数 Series (按列广播):
A 2
B 5
C 10
dtype: int64
DataFrame 除以 Series (按列广播):
A B C
row1 5.0 20.0 0.5
row2 10.0 40.0 1.5
row3 15.0 60.0 2.5
解释:
- DataFrame 的 'A' 列 (
[10, 20, 30]) 除以 Series 的 'A' 值 (2)。 - DataFrame 的 'B' 列 (
[100, 200, 300]) 除以 Series 的 'B' 值 (5)。 - 以此类推。
情况 2:Series 的索引与 DataFrame 的行索引对齐
默认情况下,广播是按列进行的,如果你想让广播按行进行,需要明确指定 axis=0。
# 创建一个 Series,其索引与 DataFrame 的行索引对齐
divisor_series_row = pd.Series([2, 5, 10], index=['row1', 'row2', 'row3'])
print("\n除数 Series (按行广播):")
print(divisor_series_row)
# 使用 axis=0 来指定按行广播
result_row = df.div(divisor_series_row, axis=0)
print("\nDataFrame 除以 Series (按行广播):")
print(result_row)
输出:
除数 Series (按行广播):
row1 2
row2 5
row3 10
dtype: int64
DataFrame 除以 Series (按行广播):
A B C
row1 5.0 50.0 2.5
row2 4.0 40.0 3.0
row3 3.0 30.0 2.5
解释:
- DataFrame 的 'row1' 行 (
[10, 100, 5]) 除以 Series 的 'row1' 值 (2)。 - DataFrame 的 'row2' 行 (
[20, 200, 15]) 除以 Series 的 'row2' 值 (5)。 - 以此类推。
DataFrame 与 DataFrame 相除
当两个 DataFrame 进行除法时,它们会根据列名和行索引对齐,然后进行逐元素除法。
# 创建另一个 DataFrame
df2 = pd.DataFrame({
'A': [2, 4, 6],
'B': [20, 25, 30],
'D': [1, 1, 1] # 注意:这个列在 df 中不存在
}, index=['row1', 'row2', 'row4']) # 注意:这个行在 df 中不存在
print("\n第二个 DataFrame:")
print(df2)
# 两个 DataFrame 进行除法
result_df = df / df2
print("\nDataFrame 除以另一个 DataFrame:")
print(result_df)
输出:
第二个 DataFrame:
A B D
row1 2 20 1
row2 4 25 1
row4 6 30 1
DataFrame 除以另一个 DataFrame:
A B C D
row1 5.0 5.0 NaN NaN
row2 5.0 8.0 NaN NaN
row3 NaN NaN NaN NaN
row4 NaN NaN NaN NaN
解释:
- 只有在两个 DataFrame 中都存在的列名和行索引对应的元素才会进行计算。
df中有'C'列,但df2没有,所以结果中'C'列为NaN。df2中有'D'列,但df没有,所以结果中'D'列为NaN。df中有'row3'行,但df2没有,所以结果中'row3'行为NaN。df2中有'row4'行,但df没有,所以结果中'row4'行为NaN。
重要参数:fill_value
在除法运算中,如果遇到 0 或 NaN,可能会导致错误或产生 NaN。fill_value 参数可以帮助解决这个问题。
我们想用 1 来填充除数 DataFrame 中的 0,以避免 ZeroDivisionError。
# 创建一个包含 0 的 DataFrame 作为除数
df_divisor_with_zero = pd.DataFrame({
'A': [2, 0, 6],
'B': [20, 25, 0]
}, index=['row1', 'row2', 'row3'])
print("\n包含 0 的除数 DataFrame:")
print(df_divisor_with_zero)
# 不使用 fill_value,会产生警告和 NaN
# result = df / df_divisor_with_zero # 会产生 RuntimeWarning
# 使用 fill_value=1,将除数中的 0 替换为 1
result_filled = df.div(df_divisor_with_zero, fill_value=1)
print("\n使用 fill_value=1 后的结果:")
print(result_filled)
输出:
包含 0 的除数 DataFrame:
A B
row1 2 20
row2 0 25
row3 6 0
使用 fill_value=1 后的结果:
A B C
row1 5.0 5.0 NaN
row2 20.0 8.0 NaN
row3 5.0 50.0 NaN
解释:
- 在
df / df_divisor_with_zero的计算中,当df的值除以0时,fill_value=1会暂时将0替换为1作为除数。 row2的A列:df['A'].loc['row2']是20,df_divisor_with_zero['A'].loc['row2']是0,计算时,20 / 1 = 20.0。- 如果被除数是
NaN,结果仍然是NaN。
其他除法相关运算
Pandas 还提供了其他有用的算术方法:
- 加法:
df + series或df.add(series) - 减法:
df - series或df.sub(series) - 乘法:
df * series或df.mul(series) - 整数除法 (地板除):
df // series或df.floordiv(series) - 取模:
df % series或df.mod(series) - 指数运算:
df ** series或df.pow(series)
| 操作 | 描述 | 示例 |
|---|---|---|
df / scalar |
DataFrame 中所有元素与标量相除 | df / 10 |
df / series |
按列广播(默认)或按行广播(axis=0) |
df / my_series 或 df.div(my_series, axis=0) |
df / df |
两个 DataFrame 逐元素相除,按索引和列对齐 | df1 / df2 |
fill_value |
在除法前填充缺失值或零,避免错误 | df.div(df2, fill_value=1) |
掌握这些操作是进行数据清洗、特征工程和数据分析的基础,关键在于理解 Pandas 的广播机制和对齐规则。
