4.5 DataFrame的数值操作与计算
Pandas DataFrame 数值操作与计算详解:从基本运算到统计排序
本章详细讲解Pandas DataFrame的数值操作与计算,包括基本算术运算、行/列统计、整体描述、排序、去重和唯一值计数,适合数据分析新手学习,并提供简单易懂的代码示例。
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的整体统计摘要,默认只针对数值列,但可以通过include和exclude参数指定数据类型。
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的核心数值操作,包括基本算术、统计运算、描述统计、排序、去重和唯一值计数。通过示例和简单解释,你应该能上手进行基础数据分析。实践中,多尝试这些方法,结合具体数据场景,提升数据处理技能。