Pandas 中文手册

4.5 DataFrame的数值操作与计算

Pandas DataFrame 数值操作与计算详解:从基本运算到统计排序

Pandas 中文手册

本章详细讲解Pandas DataFrame的数值操作与计算,包括基本算术运算、行/列统计、整体描述、排序、去重和唯一值计数,适合数据分析新手学习,并提供简单易懂的代码示例。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

DataFrame的数值操作与计算

DataFrame是Pandas的核心数据结构,用于存储和处理表格数据。数值操作与计算是数据分析的基础,本章将带你从新手角度,学习如何对DataFrame进行各种数值处理。

1. 基本算术运算

DataFrame支持多种算术运算,包括与标量、其他DataFrame、行或列的运算。运算会逐元素进行,无需显式循环。

与标量运算

直接将DataFrame与单个数字(标量)相加、减、乘、除等。

import pandas as pd

# 创建示例DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
print(df)
#    A  B
# 0  1  4
# 1  2  5
# 2  3  6

# 与标量相加
result = df + 10
print(result)
#     A   B
# 0  11  14
# 1  12  15
# 2  13  16

与其他DataFrame运算

要求两个DataFrame形状相同(行列数一致),对应位置元素进行运算。

df2 = pd.DataFrame({'A': [0.5, 1.5, 2.5], 'B': [1, 2, 3]})
result = df * df2
print(result)
#      A     B
# 0  0.5   4.0
# 1  3.0  10.0
# 2  7.5  18.0

与行或列运算

可以使用广播机制,例如将一列或一行数据与整个DataFrame运算。

# 与单列运算:添加列C,并计算A列加B列的值
df['C'] = df['A'] + df['B']
print(df)
#    A  B   C
# 0  1  4   5
# 1  2  5   7
# 2  3  6   9

# 与行运算:例如,将第一行数据加到整个DataFrame(使用loc或iloc)
row_data = df.iloc[0]  # 获取第一行
result = df + row_data  # 广播:每行加上第一行的值
print(result)
#    A   B    C
# 0  2   8   10
# 1  3   9   12
# 2  4  10   14

注意:如果形状不匹配,Pandas会尝试广播,但可能产生NaN或错误,建议先对齐索引。

2. 按行/列的统计运算

Pandas提供了多种统计函数,如sum、mean、max、min等,通过axis参数指定按行或列计算。

  • axis=0:默认值,按列操作(即对每列进行统计)。
  • axis=1:按行操作(即对每行进行统计)。
# 创建包含数值的DataFrame
df = pd.DataFrame({'Math': [85, 90, 78], 'English': [88, 92, 80], 'Science': [75, 85, 70]})
print(df)
#    Math  English  Science
# 0    85       88       75
# 1    90       92       85
# 2    78       80       70

# 按列统计:计算每列的总和、平均值、最大值
col_sum = df.sum(axis=0)  # 或 df.sum(),axis=0是默认
print(col_sum)
# Math       253
# English    260
# Science    230

col_mean = df.mean(axis=0)
print(col_mean)
# Math       84.333333
# English    86.666667
# Science    76.666667

# 按行统计:计算每行的总和、平均值
row_sum = df.sum(axis=1)
print(row_sum)
# 0    248
# 1    267
# 2    228

row_mean = df.mean(axis=1)
print(row_mean)
# 0    82.666667
# 1    89.000000
# 2    76.000000

其他常用统计函数:std(标准差)、var(方差)、median(中位数)等,用法类似。

3. 整体统计描述

describe()方法提供DataFrame的整体统计摘要,默认只针对数值列,但可以通过includeexclude参数指定数据类型。

df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': ['a', 'b', 'c', 'd', 'e'], 'C': [1.1, 2.2, 3.3, 4.4, 5.5]})
print(df)
#    A  B    C
# 0  1  a  1.1
# 1  2  b  2.2
# 2  3  c  3.3
# 3  4  d  4.4
# 4  5  e  5.5

# 默认只统计数值列
summary = df.describe()
print(summary)
#               A         C
# count  5.000000  5.000000
# mean   3.000000  3.300000
# std    1.581139  1.581139
# min    1.000000  1.100000
# 25%    2.000000  2.200000
# 50%    3.000000  3.300000
# 75%    4.000000  4.400000
# max    5.000000  5.500000

# 按数据类型统计:例如,包括所有列
summary_all = df.describe(include='all')
print(summary_all)
# 这会为数值列提供统计,为类别列(如B)提供频率等。

include参数可以指定如'number'(数值)、'object'(对象类型)等。

4. 排序操作

排序可以按值、按索引或多列进行,使用sort_values()sort_index()方法。

按值排序

df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'], 'Score': [85, 92, 78]})
print(df)
#       Name  Score
# 0    Alice     85
# 1      Bob     92
# 2  Charlie     78

# 按Score列升序排序
sorted_df = df.sort_values(by='Score')
print(sorted_df)
#       Name  Score
# 2  Charlie     78
# 0    Alice     85
# 1      Bob     92

# 降序排序
sorted_df_desc = df.sort_values(by='Score', ascending=False)
print(sorted_df_desc)
#       Name  Score
# 1      Bob     92
# 0    Alice     85
# 2  Charlie     78

按索引排序

df.index = [2, 0, 1]  # 设置自定义索引
print(df)
#       Name  Score
# 2    Alice     85
# 0      Bob     92
# 1  Charlie     78

# 按索引排序
sorted_index = df.sort_index()
print(sorted_index)
#       Name  Score
# 0      Bob     92
# 1  Charlie     78
# 2    Alice     85

按多列排序

指定多个列名列表,依次排序。

df = pd.DataFrame({'Group': ['A', 'A', 'B', 'B'], 'Score': [85, 90, 78, 88]})
print(df)
#   Group  Score
# 0     A     85
# 1     A     90
# 2     B     78
# 3     B     88

# 先按Group升序,再按Score降序
sorted_multi = df.sort_values(by=['Group', 'Score'], ascending=[True, False])
print(sorted_multi)
#   Group  Score
# 1     A     90
# 0     A     85
# 3     B     88
# 2     B     78

5. 去重操作

使用drop_duplicates()方法移除DataFrame中的重复行。

按行去重

默认基于所有列,移除完全相同的行。

df = pd.DataFrame({'A': [1, 2, 2, 3], 'B': ['x', 'y', 'y', 'z']})
print(df)
#    A  B
# 0  1  x
# 1  2  y
# 2  2  y  # 重复行
# 3  3  z

# 移除重复行
df_no_duplicates = df.drop_duplicates()
print(df_no_duplicates)
#    A  B
# 0  1  x
# 1  2  y
# 3  3  z

按列去重

通过subset参数指定基于哪些列判断重复。

# 基于A列去重:保留第一个出现的重复值
df_subset = df.drop_duplicates(subset='A')
print(df_subset)
#    A  B
# 0  1  x
# 1  2  y
# 3  3  z

其他参数:keep可以设置为'first'(默认,保留第一个)、'last'(保留最后一个)或False(移除所有重复)。

6. 唯一值与计数

获取列中的唯一值并计数,使用value_counts()nunique()方法。

value_counts()

返回唯一值及其出现次数,默认按频率降序排列。

df = pd.DataFrame({'Color': ['Red', 'Blue', 'Red', 'Green', 'Blue']})
print(df['Color'].value_counts())
# Red      2
# Blue     2
# Green    1
# Name: Color, dtype: int64

# 可以设置normalize=True获取频率比例
print(df['Color'].value_counts(normalize=True))
# Red      0.4
# Blue     0.4
# Green    0.2

nunique()

返回列中唯一值的数量。

unique_count = df['Color'].nunique()
print(unique_count)  # 输出: 3

按列统计

对整个DataFrame使用nunique(),默认按列计算唯一值数量。

df = pd.DataFrame({'A': [1, 2, 2, 3], 'B': ['x', 'y', 'y', 'z']})
print(df.nunique())
# A    3  # 唯一值:1, 2, 3
# B    3  # 唯一值:x, y, z

总结

本章涵盖了DataFrame的核心数值操作,包括基本算术、统计运算、描述统计、排序、去重和唯一值计数。通过示例和简单解释,你应该能上手进行基础数据分析。实践中,多尝试这些方法,结合具体数据场景,提升数据处理技能。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包