在数据分析中,Pandas 提供了丰富的数据处理功能。本文将详细介绍 Pandas 中几个核心操作:数据合并(merge)、值替换(replace)、统计计算以及分组聚合(groupby),并通过实例代码展示其用法。
目录
数据合并操作
Pandas 提供了 merge
方法用于数据合并,与 concat
不同的是,merge
需要依据某一共同列来进行合并,类似数据库的连接操作。
基本合并示例
import pandas as pd
import numpy as np
# 创建示例数据
df_obj1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
'data1': np.random.randint(0, 10, 7)})
df_obj2 = pd.DataFrame({'key': ['a', 'b', 'd'],
'data2': np.random.randint(0, 10, 3)})
print("df_obj1:")
print(df_obj1)
print("\ndf_obj2:")
print(df_obj2)
# 默认合并:将重叠列的列名作为"外键"进行连接
print("\n默认合并结果:")
print(pd.merge(df_obj1, df_obj2))
显示指定 "外键"
# 使用 on 参数显示指定合并的列
print(pd.merge(df_obj1, df_obj2, on='key'))
左右键名不同时的合并
当左右两个 DataFrame 用于合并的列名不同时,可以使用 left_on
和 right_on
参数分别指定:
# 更改列名
df_obj1 = df_obj1.rename(columns={'key':'key1'})
df_obj2 = df_obj2.rename(columns={'key':'key2'})
# 分别指定左右两侧用于合并的列
print(pd.merge(df_obj1, df_obj2, left_on='key1', right_on='key2'))
不同连接方式
merge 支持多种连接方式,通过 how
参数指定:
# 外连接(outer):结果中的键是并集
print("外连接结果:")
print(pd.merge(df_obj1, df_obj2, left_on='key1', right_on='key2', how='outer'))
# 左连接(left):保留左表所有键
print("\n左连接结果:")
print(pd.merge(df_obj1, df_obj2, left_on='key1', right_on='key2', how='left'))
# 右连接(right):保留右表所有键
print("\n右连接结果:")
print(pd.merge(df_obj1, df_obj2, left_on='key1', right_on='key2', how='right'))
处理重复列名
当合并的两个 DataFrame 存在同名但不用于合并的列时,可以使用 suffixes
参数为重复列名添加后缀:
# 创建有重复列名的数据
df_obj1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
'data' : np.random.randint(0,10,7)})
df_obj2 = pd.DataFrame({'key': ['a', 'b', 'd'],
'data' : np.random.randint(0,10,3)})
# 使用 suffixes 处理重复列名
print(pd.merge(df_obj1, df_obj2, on='key', suffixes=('_left', '_right')))
按索引连接
除了按列连接,还可以按索引进行连接:
# 创建按索引连接的示例数据
df_obj1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],
'data1' : np.random.randint(0,10,7)})
df_obj2 = pd.DataFrame({'data2' : np.random.randint(0,10,3)}, index=['a', 'b', 'd'])
# 左表按列连接,右表按索引连接
print(pd.merge(df_obj1, df_obj2, left_on='key', right_index=True))
replace 替代值
Pandas 的 replace
方法用于替换 Series 或 DataFrame 中的值,支持多种替换方式:
单个值替换单个值
# 将 Series 中所有值为 1 的元素,替换为 -100
print(ser_obj.replace(1, -100))
示例:若原 ser_obj 是 [1, 2, 3, 1, 5],替换后结果为 [-100, 2, 3, -100, 5]
多个值替换一个值
# 将 Series 中所有值为 6 或 8 的元素,统一替换为 -100
print(ser_obj.replace([6, 8], -100))
示例:若原 ser_obj 是 [5, 6, 7, 8, 9],替换后结果为 [5, -100, 7, -100, 9]
多个值替换多个值
# 按位置一一对应替换:将 4 替换为 -100,将 7 替换为 -200
print(ser_obj.replace([4, 7], [-100, -200]))
示例:若原 ser_obj 是 [3, 4, 5, 7, 8],替换后结果为 [3, -100, 5, -200, 8]
统计计算和描述
Pandas 提供了丰富的统计计算方法,以及 describe()
方法快速生成数据的统计描述。
基本统计计算
import numpy as np
import pandas as pd
# 创建 5 行 4 列的 DataFrame
df_obj = pd.DataFrame(
np.random.randn(5, 4), # 生成 5×4 的标准正态分布随机数
columns=['a', 'b', 'c', 'd']
)
print("原始 DataFrame:")
print(df_obj)
# 按列求和(axis=0 可省略)
col_sum = df_obj.sum()
print("\n按列求和:")
print(col_sum)
# 按行求和(axis=1)
row_sum = df_obj.sum(axis=1)
print("\n按行求和:")
print(row_sum)
# 按列求最大值
col_max = df_obj.max()
print("\n按列最大值:")
print(col_max)
# 按行求最小值
row_min = df_obj.min(axis=1)
print("\n按行最小值:")
print(row_min)
# 求均值
print("\n均值:")
print(df_obj.mean())
统计描述
describe()
方法可以快速生成数据的主要统计量:
# 生成统计描述
desc = df_obj.describe()
print("\n统计描述:")
print(desc)
# 转置后对行(原列)做统计描述
row_desc = df_obj.T.describe()
print("\n转置后的统计描述:")
print(row_desc)
分组与聚合
在数据分析中,经常需要对数据进行分组并对每组数据进行聚合计算,pandas 的 groupby 功能提供了强大支持。
GroupBy 核心概念
分组是数据分析中按规则拆分数据、应用计算并合并结果的过程,核心流程为:
- 拆分(split):按指定依据将数据集划分为若干组
- 应用(apply):对每组数据执行统计或自定义计算
- 合并(combine):将每组的计算结果整合为最终输出
基本分组操作
import pandas as pd
import numpy as np
# 创建示例数据
dict_obj = {'key1': ['a', 'b', 'a', 'b',
'a', 'b', 'a', 'a'],
'key2': ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'data1': np.random.randn(8),
'data2': np.random.randn(8)}
df_obj = pd.DataFrame(dict_obj)
print("原始数据:")
print(df_obj)
# 根据 key1 进行分组
grouped1 = df_obj.groupby('key1')
print("\n按 key1 分组后的均值:")
print(grouped1[['data1', 'data2']].mean())
# 对特定列根据 key1 进行分组
grouped2 = df_obj['data1'].groupby(df_obj['key1'])
print("\ndata1 列按 key1 分组后的均值:")
print(grouped2.mean())
分组方式拓展
除了按列名分组,Pandas 还支持多种分组方式:
# 1. 自定义 key 列表分组(列表长度需与数据行数一致)
self_def_key = [0, 1, 2, 3, 3, 4, 5, 7]
print("\n自定义 key 分组大小:")
print(df_obj.groupby(self_def_key).size())
# 2. 多层列分组(按多个列名组合分组)
print("\n按 key1 和 key2 多层分组大小:")
print(df_obj.groupby(['key1', 'key2']).size())
# 3. 按数据类型分组
print("\n按列数据类型分组求和:")
print(df_obj.groupby(df_obj.dtypes, axis=1).sum())
# 4. 字典映射分组(适用于列级分组)
mapping_dict = {'data1': 'numeric', 'data2': 'numeric', 'key1': 'category', 'key2': 'category'}
print("\n按字典映射分组求和:")
print(df_obj.groupby(mapping_dict, axis=1).sum())
# 5. 函数分组(按函数返回值分组)
print("\n按索引长度分组大小:")
print(df_obj.groupby(lambda idx: len(str(idx))).size())
以上就是 Pandas 中数据合并、值替换、统计计算和分组聚合的核心操作。这些功能为数据分析提供了强大的支持,能够高效处理各种数据转换和分析任务。根据实际需求选择合适的方法,可以极大提高数据分析的效率。