程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

第六章:DataFrame 的数据运算与分组操作

balukai 2025-07-23 13:07:46 文章精选 5 ℃

6.1 DataFrame 的算术运算

DataFrame 支持多种算术运算,这些运算会按照行列对齐的方式应用到对应元素上。

6.1.1 两个 DataFrame 相加

当两个 DataFrame 进行加法运算时,Pandas 会根据行列索引对齐元素,然后将对应位置的元素相加。如果某个位置在其中一个 DataFrame 中存在而在另一个中不存在,结果会是 NaN。

import pandas as pd

df1 = pd.DataFrame({
    'A': [1, 2],
    'B': [3, 4]
})

df2 = pd.DataFrame({
    'A': [5, 6],
    'B': [7, 8]
})

result = df1 + df2
print(result)

输出结果为:

   A   B
0  6  10
1  8  12

这里 df1 和 df2 的 A 列和 B 列对应位置的元素分别相加。

6.1.2 DataFrame 与标量相加

DataFrame 与标量进行运算时,标量会与 DataFrame 的每个元素进行相应运算。

import pandas as pd

df = pd.DataFrame({
    'A': [1, 2],
    'B': [3, 4]
})

scalar = 2
result = df + scalar
print(result)

输出为:

   A  B
0  3  5
1  4  6

即 df 中的每个元素都加上了标量 2。

6.1.3 不同索引的 DataFrame 运算

如果两个 DataFrame 的索引不完全相同,运算时会自动对齐索引。对于没有匹配的位置,结果为 NaN。

import pandas as pd

df1 = pd.DataFrame({
    'A': [1, 2],
    'B': [3, 4]
}, index=[0, 1])

df2 = pd.DataFrame({
    'A': [5, 6],
    'B': [7, 8]
}, index=[1, 2])

result = df1 + df2
print(result)

输出结果:

     A    B
0  NaN  NaN
1  7.0 11.0
2  NaN  NaN

在这个例子中,只有索引为 1 的行有匹配的元素,所以只有这一行能得到正确的相加结果,其他行由于索引不匹配,对应位置为 NaN。

6.2 DataFrame 的统计运算

Pandas 为 DataFrame 提供了丰富的统计运算方法,帮助我们快速了解数据的特征。

6.2.1 求和运算

  • 按列求和:使用 sum() 方法并指定 axis = 0(默认值),可以计算每列的总和。
import pandas as pd

df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
})

column_sum = df.sum(axis = 0)
print(column_sum)

输出为:

A    6
B    15
dtype: int64

这表示 A 列的总和为 6,B 列的总和为 15。

  • 按行求和:通过设置 axis = 1,可以计算每行的总和。
import pandas as pd

df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
})

row_sum = df.sum(axis = 1)
print(row_sum)

输出为:

0    5
1    7
2    9
dtype: int64

这里每行的元素相加得到每行的总和。

6.2.2 均值运算

  • 按列求均值:使用 mean() 方法并指定 axis = 0 计算每列的均值。
import pandas as pd

df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
})

column_mean = df.mean(axis = 0)
print(column_mean)

输出为:

A    2.0
B    5.0
dtype: float64

A 列的均值为 2.0,B 列的均值为 5.0。

  • 按行求均值:设置 axis = 1 计算每行的均值。
import pandas as pd

df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
})

row_mean = df.mean(axis = 1)
print(row_mean)

输出为:

0    2.5
1    3.5
2    4.5
dtype: float64

每行元素的均值分别为 2.5、3.5 和 4.5。

6.2.3 其他统计运算

除了求和与均值,DataFrame 还支持如 max()(求最大值)、min()(求最小值)、median()(求中位数)等统计运算,使用方法类似。

import pandas as pd

df = pd.DataFrame({
    'A': [1, 2, 3],
    'B': [4, 5, 6]
})

max_values = df.max()
min_values = df.min()
median_values = df.median()

print("最大值:\n", max_values)
print("最小值:\n", min_values)
print("中位数:\n", median_values)

输出结果为:

最大值:
A    3
B    6
dtype: int64
最小值:
A    1
B    4
dtype: int64
中位数:
A    2.0
B    5.0
dtype: float64

6.3 DataFrame 的分组操作

分组操作是数据分析中常用的操作,Pandas 的 groupby 方法可以根据一个或多个列对数据进行分组,并对每个组应用统计函数。

6.3.1 单分组列

假设我们有一份销售数据,包含产品名称和销售额,我们想按产品名称统计销售额总和。

import pandas as pd

data = {
    '产品名称': ['苹果', '香蕉', '苹果', '香蕉'],
    '销售额': [100, 150, 120, 130]
}

df = pd.DataFrame(data)

grouped = df.groupby('产品名称').sum()
print(grouped)

这里使用 groupby('产品名称') 按产品名称进行分组,然后对每个组的 销售额 列应用 sum() 函数,输出结果为:

      销售额
产品名称
苹果    220
香蕉    280

可以看到,分别计算出了苹果和香蕉的总销售额。

6.3.2 多分组列

如果我们的数据还包含销售地区,想同时按产品名称和销售地区统计销售额总和。

import pandas as pd

data = {
    '产品名称': ['苹果', '香蕉', '苹果', '香蕉'],
    '销售地区': ['北京', '上海', '北京', '上海'],
    '销售额': [100, 150, 120, 130]
}

df = pd.DataFrame(data)

grouped = df.groupby(['产品名称', '销售地区']).sum()
print(grouped)

这里通过 groupby(['产品名称', '销售地区']) 按产品名称和销售地区两个列进行分组,输出为:

                销售额
产品名称  销售地区    
苹果    北京      220
香蕉    上海      280

这样就可以看到不同产品在不同地区的销售总额。

6.3.3 对分组数据应用多个函数

除了使用单个统计函数,还可以对分组数据应用多个不同的函数。

import pandas as pd

data = {
    '产品名称': ['苹果', '香蕉', '苹果', '香蕉'],
    '销售额': [100, 150, 120, 130]
}

df = pd.DataFrame(data)

grouped = df.groupby('产品名称').agg(['sum','mean'])
print(grouped)

这里使用 agg() 方法对每个分组应用 sum(求和)和 mean(求均值)函数,输出为:

         销售额      
          sum  mean
产品名称            
苹果      220  110.0
香蕉      280  140.0

可以同时看到每个产品的销售额总和与平均销售额。

最近发表
标签列表