一文详解Python如何优雅地对数据进行分组
在数据分析、数据处理等场景下,对数据进行分组显得十分重要。Python 提供了多种方法对数据进行分组,其中包括:
- 使用 Pandas 库
- 使用 itertools 模块
- 使用自定义函数
在下面的内容中,我们将依次介绍这三种方法。
使用 Pandas 库
Pandas 库有丰富的分组功能,可以方便地对数据进行分组、聚合、过滤等操作。
1. 按列分组
我们可以使用 groupby()
方法按照某一列的值对数据进行分组。例如,我们有以下数据:
import pandas as pd
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eva', 'Frank'],
'age': [23, 24, 22, 22, 21, 25],
'gender': ['F', 'M', 'M', 'M', 'F', 'M'],
'score': [85, 93, 79, 81, 90, 87]
})
我们可以按照性别对数据进行分组:
grouped = df.groupby('gender')
这样我们就得到了一个按照性别分组后的对象,我们可以对它进行相关的操作,例如计算每个分组的平均分数:
grouped['score'].mean()
2. 按多列分组
当我们需要按照多列的值进行分组时,可以同时传入多个列名,例如:
grouped = df.groupby(['gender', 'age'])
这样我们就可以按照性别和年龄两个维度对数据进行分组。
3. 聚合操作
在分组后,我们常常需要进行聚合操作,例如计算分组后每个组的平均值、最大值、最小值等等。Pandas 提供了一些聚合函数,例如 mean()
、max()
、min()
等。
grouped['score'].mean()
grouped['score'].max()
grouped['score'].min()
4. 过滤操作
我们还可以使用 filter()
方法对分组后的数据进行筛选,例如筛选出平均分数大于等于 85 分的分组:
def filter_func(x):
return x['score'].mean() >= 85
grouped.filter(filter_func)
使用 itertools 模块
Python 标准库中的 itertools 模块也提供了分组的函数。我们可以使用 groupby()
函数对一个可迭代对象进行分组。例如:
from itertools import groupby
data = [
{'name': 'Alice', 'score': 85},
{'name': 'Bob', 'score': 93},
{'name': 'Charlie', 'score': 79},
{'name': 'David', 'score': 81},
{'name': 'Eva', 'score': 90},
{'name': 'Frank', 'score': 87},
{'name': 'Gary', 'score': 82},
{'name': 'Helen', 'score': 79},
{'name': 'Isaac', 'score': 85},
]
def key_func(row):
if row['score'] >= 90:
return 'A'
elif row['score'] >= 80:
return 'B'
else:
return 'C'
sorted_data = sorted(data, key=key_func)
for key, values in groupby(sorted_data, key=key_func):
print(f'{key}: {list(values)}')
这样我们就可以按照分数的高低对数据进行分组。
自定义函数
除了使用 Pandas 和 itertools 提供的方法外,我们还可以根据需要自定义函数进行分组。
例如,我们有一个列表,需要对其中的偶数和奇数进行分组:
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def key_func(num):
if num % 2 == 0:
return 'even'
else:
return 'odd'
grouped_data = {}
for num in nums:
key = key_func(num)
if key in grouped_data:
grouped_data[key].append(num)
else:
grouped_data[key] = [num]
print(grouped_data)
使用自定义函数进行分组时,需要注意函数的返回值类型必须是 hashable,即可哈希的,否则 Python 会抛出 TypeError 异常。
以上就是 Python 如何优雅地对数据进行分组的完整攻略。