杰瑞科技汇

Python DataFrame除法怎么实现?

核心方法

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

Python DataFrame除法怎么实现?-图1
(图片来源网络,侵删)
  1. 使用除法运算符 :这是最直观、最常用的方法。
  2. 使用 .divide() 方法:功能与 类似,但可以提供更灵活的参数,axisfill_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)

输出:

Python DataFrame除法怎么实现?-图2
(图片来源网络,侵删)
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)

输出:

Python DataFrame除法怎么实现?-图3
(图片来源网络,侵删)
除数 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

在除法运算中,如果遇到 0NaN,可能会导致错误或产生 NaNfill_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 作为除数。
  • row2A 列:df['A'].loc['row2']20df_divisor_with_zero['A'].loc['row2']0,计算时,20 / 1 = 20.0
  • 如果被除数是 NaN,结果仍然是 NaN

其他除法相关运算

Pandas 还提供了其他有用的算术方法:

  • 加法: df + seriesdf.add(series)
  • 减法: df - seriesdf.sub(series)
  • 乘法: df * seriesdf.mul(series)
  • 整数除法 (地板除): df // seriesdf.floordiv(series)
  • 取模: df % seriesdf.mod(series)
  • 指数运算: df ** seriesdf.pow(series)
操作 描述 示例
df / scalar DataFrame 中所有元素与标量相除 df / 10
df / series 按列广播(默认)或按行广播(axis=0 df / my_seriesdf.div(my_series, axis=0)
df / df 两个 DataFrame 逐元素相除,按索引和列对齐 df1 / df2
fill_value 在除法前填充缺失值或零,避免错误 df.div(df2, fill_value=1)

掌握这些操作是进行数据清洗、特征工程和数据分析的基础,关键在于理解 Pandas 的广播机制对齐规则

分享:
扫描分享到社交APP
上一篇
下一篇