Python数据分组与拆分:从基础到高级的数据处理艺术95
---
在数据分析、机器学习以及日常的数据处理任务中,我们经常需要对数据进行“分组”和“拆分”。“分组”通常指根据某个或某几个属性将数据集划分为多个子集,以便对每个子集进行独立的操作或聚合;而“拆分”则是指将一个大的数据集按照某种规则(如条件、数量、比例等)切割成多个更小的部分。Python凭借其强大的数据处理库,为这两种操作提供了极其灵活和高效的解决方案。本文将深入探讨Python中实现数据分组与拆分的各种方法,从基础的内置数据结构到高级的Pandas和NumPy库,帮助你掌握数据处理的核心技能。
一、Python基础数据结构的分组与拆分
在没有引入第三方库之前,Python内置的数据结构(如列表、字典)也能进行基本的分组与拆分操作,尽管可能需要更多的手动代码。
1.1 列表 (List) 的分组与拆分
1.1.1 列表分组
对于列表,最常见的分组场景是根据元素的某个属性值进行分组。例如,一个包含字典的列表,我们想根据字典中某个键的值来分组。
方法一:使用循环和字典 (手动分组)
data = [
{'name': 'Alice', 'city': 'New York', 'age': 30},
{'name': 'Bob', 'city': 'London', 'age': 24},
{'name': 'Charlie', 'city': 'New York', 'age': 35},
{'name': 'David', 'city': 'Paris', 'age': 29},
{'name': 'Eve', 'city': 'London', 'age': 22},
]
grouped_by_city = {}
for item in data:
city = item['city']
if city not in grouped_by_city:
grouped_by_city[city] = []
grouped_by_city[city].append(item)
print("按城市分组 (手动):")
for city, items in ():
print(f" {city}: {items}")
方法二:使用 `` (更简洁)
from collections import defaultdict
grouped_by_city_dd = defaultdict(list)
for item in data:
grouped_by_city_dd[item['city']].append(item)
print("按城市分组 (defaultdict):")
for city, items in ():
print(f" {city}: {items}")
方法三:使用 `` (适用于已排序数据,按相邻元素分组)
`` 是一个非常高效的工具,但它有一个重要的特性:它只对连续的、相同的键进行分组。因此,在使用它之前,通常需要先对数据进行排序。
from itertools import groupby
# 必须先排序
sorted_data = sorted(data, key=lambda x: x['city'])
grouped_by_city_itertools = {}
for key, group in groupby(sorted_data, key=lambda x: x['city']):
grouped_by_city_itertools[key] = list(group)
print("按城市分组 ( - 需先排序):")
for city, items in ():
print(f" {city}: {items}")
1.1.2 列表拆分
列表拆分可以根据索引、条件或固定大小进行。
方法一:按条件拆分 (列表推导式或 `filter`)
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 拆分为偶数和奇数
evens = [n for n in numbers if n % 2 == 0]
odds = [n for n in numbers if n % 2 != 0]
print(f"原始列表: {numbers}")
print(f"偶数列表: {evens}")
print(f"奇数列表: {odds}")
# 使用 filter
evens_filter = list(filter(lambda x: x % 2 == 0, numbers))
odds_filter = list(filter(lambda x: x % 2 != 0, numbers))
print(f"偶数列表 (filter): {evens_filter}")
方法二:按固定大小拆分 (Chunking)
def chunk_list(lst, chunk_size):
for i in range(0, len(lst), chunk_size):
yield lst[i:i + chunk_size]
my_list = list(range(1, 13))
chunks = list(chunk_list(my_list, 3))
print(f"原始列表: {my_list}")
print(f"按大小3拆分: {chunks}")
方法三:按索引拆分 (切片)
data_list = ['A', 'B', 'C', 'D', 'E', 'F']
part1 = data_list[:3]
part2 = data_list[3:]
print(f"原始列表: {data_list}")
print(f"前三部分: {part1}")
print(f"后三部分: {part2}")
1.2 字典 (Dictionary) 的拆分
字典通常不是直接进行“分组”,而是将一个大字典拆分成多个小字典,或根据键或值进行筛选。
person_data = {
'name': 'Alice',
'age': 30,
'city': 'New York',
'occupation': 'Engineer',
'salary': 70000
}
# 拆分出基本信息和财务信息
basic_info = {k: person_data[k] for k in ['name', 'age', 'city']}
financial_info = {k: person_data[k] for k in ['occupation', 'salary']}
print(f"原始字典: {person_data}")
print(f"基本信息: {basic_info}")
print(f"财务信息: {financial_info}")
二、高级数据处理库的应用:Pandas与NumPy
在实际的数据科学和工程中,我们处理的数据往往是结构化的表格数据(如CSV、数据库表),这时Pandas和NumPy库就成为了不可或缺的利器。
2.1 Pandas DataFrame 的分组与拆分
Pandas是Python数据处理的王者,其`DataFrame`结构和`groupby()`方法是数据分组的强大工具。
2.1.1 DataFrame 分组 (`groupby()`)
Pandas的`groupby()`方法是其核心功能之一,它支持根据一个或多个列的值进行分组,并对每个组执行聚合、转换或过滤操作。
import pandas as pd
import numpy as np
# 示例数据
df = ({
'City': ['New York', 'London', 'New York', 'Paris', 'London', 'Paris', 'New York'],
'Category': ['A', 'B', 'A', 'C', 'B', 'A', 'C'],
'Value': [100, 150, 120, 200, 130, 180, 110],
'Quantity': [10, 5, 8, 12, 6, 9, 7]
})
print("原始DataFrame:")
print(df)
# 按单列分组并计算总和
grouped_by_city = ('City')['Value'].sum()
print("按城市分组,计算Value总和:")
print(grouped_by_city)
# 按多列分组并计算平均值
grouped_by_city_category = (['City', 'Category'])['Value'].mean()
print("按城市和类别分组,计算Value平均值:")
print(grouped_by_city_category)
# 使用agg()进行多种聚合操作
agg_results = ('City').agg(
TotalValue=('Value', 'sum'),
AverageQuantity=('Quantity', 'mean'),
Count=('City', 'size') # 统计每个组的行数
)
print("按城市分组,使用agg进行多种聚合:")
print(agg_results)
# 使用transform()在组内进行转换,并将结果广播回原始DataFrame
# 例如:计算每个城市中Value占该城市总Value的比例
df['City_Value_Ratio'] = ('City')['Value'].transform(lambda x: x / ())
print("使用transform计算城市内Value占比:")
print(df)
# 使用filter()过滤掉不满足条件的组
# 例如:只保留总Value大于300的城市
filtered_groups = ('City').filter(lambda x: x['Value'].sum() > 300)
print("过滤掉总Value小于等于300的城市组:")
print(filtered_groups)
# 使用apply()进行更复杂的组操作
# 例如:获取每个城市Value最高的行
def get_max_value_row(group):
return [group['Value'].idxmax()]
max_value_per_city = ('City').apply(get_max_value_row)
print("使用apply获取每个城市Value最高的行:")
print(max_value_per_city)
2.1.2 DataFrame 拆分
DataFrame的拆分主要通过条件筛选(布尔索引)、行/列索引以及特定的函数实现。
# 示例数据 (同上)
# df = ...
# 按条件拆分:例如,Value大于150和Value小于等于150
df_high_value = df[df['Value'] > 150]
df_low_value = df[df['Value']
2025-11-01
PHP应用中的数据库数量策略:从单体到分布式,深度解析架构选择与性能优化
https://www.shuihudhg.cn/131619.html
全面解析PHP文件上传报错:从根源到解决方案的专家指南
https://www.shuihudhg.cn/131618.html
Java字符串高效删除指定字符:多维方法解析与性能优化实践
https://www.shuihudhg.cn/131617.html
Python 字符串替换:深入解析 `()` 方法的原理、用法与高级实践
https://www.shuihudhg.cn/131616.html
PHP 数组深度解析:高效添加、修改与管理策略
https://www.shuihudhg.cn/131615.html
热门文章
Python 格式化字符串
https://www.shuihudhg.cn/1272.html
Python 函数库:强大的工具箱,提升编程效率
https://www.shuihudhg.cn/3366.html
Python向CSV文件写入数据
https://www.shuihudhg.cn/372.html
Python 静态代码分析:提升代码质量的利器
https://www.shuihudhg.cn/4753.html
Python 文件名命名规范:最佳实践
https://www.shuihudhg.cn/5836.html