数据聚合与分组是数据分析中的重要操作,用于按某些条件对数据进行分组,并对每个组进行汇总统计。pandas
库提供了强大的分组和聚合功能。
1. 数据分组
数据分组(Grouping)指的是将数据根据某些条件分为不同的组。可以使用groupby()
函数进行分组操作。
示例
import pandas as pd
# 创建数据帧
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Edward'],
'City': ['New York', 'Los Angeles', 'New York', 'Chicago', 'Chicago'],
'Age': [25, 30, 35, 40, 50],
'Salary': [50000, 60000, 70000, 80000, 90000]}
df = pd.DataFrame(data)
print("原始数据帧:")
print(df)
# 按城市分组
grouped = df.groupby('City')
print("\n按城市分组的数据:")
for name, group in grouped:
print(f"\n城市: {name}")
print(group)
2. 数据聚合
数据聚合(Aggregation)是指对分组后的数据进行汇总统计。常见的聚合操作包括求和、平均值、计数、最大值、最小值等。可以使用agg()
方法进行聚合操作。
示例
# 按城市分组并计算每个城市的平均年龄和平均薪水
aggregated = grouped.agg({'Age': 'mean', 'Salary': 'mean'})
print("\n按城市聚合的数据:")
print(aggregated)
3. 多重聚合
可以对一个列应用多个聚合函数,也可以对不同的列应用不同的聚合函数。
示例
# 对年龄应用多个聚合函数,对薪水应用单个聚合函数
multi_aggregated = grouped.agg({'Age': ['mean', 'max'], 'Salary': 'sum'})
print("\n多重聚合的数据:")
print(multi_aggregated)
4. 分组后的数据转换
分组后的数据可以使用transform()
方法进行转换,生成与原数据帧大小相同的输出。常用于标准化、归一化等操作。
示例
# 创建数据帧
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Edward'],
'City': ['New York', 'Los Angeles', 'New York', 'Chicago', 'Chicago'],
'Age': [25, 30, 35, 40, 50],
'Salary': [50000, 60000, 70000, 80000, 90000]}
df = pd.DataFrame(data)
print("\n原始数据帧:")
print(df)
# 按城市分组并计算每个城市的平均年龄和平均薪水
grouped = df.groupby('City')
aggregated = grouped.agg({'Age': 'mean', 'Salary': 'mean'})
print("\n按城市聚合的数据:")
print(aggregated)
# 对年龄应用多个聚合函数,对薪水应用单个聚合函数
multi_aggregated = grouped.agg({'Age': ['mean', 'max'], 'Salary': 'sum'})
print("\n多重聚合的数据:")
print(multi_aggregated)
# 标准化薪水(每个城市内部的标准化)
df['Standardized_Salary'] = grouped['Salary'].transform(lambda x: (x - x.mean()) / x.std())
print("\n标准化薪水后的数据帧:")
print(df)
5. 分组后的数据过滤
可以对分组后的数据进行过滤,只保留满足条件的组。可以使用filter()
方法进行操作。
示例
# 过滤掉平均薪水低于75000的城市
filtered = grouped.filter(lambda x: x['Salary'].mean() > 75000)
print("\n过滤后的数据帧:")
print(filtered)
6. 可运行的Python案例
下面是一个完整的Python程序,演示了数据聚合与分组的基本操作,包括分组、聚合、多重聚合、转换和过滤。
import pandas as pd
# 创建数据帧
data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Edward'],
'City': ['New York', 'Los Angeles', 'New York', 'Chicago', 'Chicago'],
'Age': [25, 30, 35, 40, 50],
'Salary': [50000, 60000, 70000, 80000, 90000]}
df = pd.DataFrame(data)
print("原始数据帧:")
print(df)
# 按城市分组
grouped = df.groupby('City')
print("\n按城市分组的数据:")
for name, group in grouped:
print(f"\n城市: {name}")
print(group)
# 按城市分组并计算每个城市的平均年龄和平均薪水
aggregated = grouped.agg({'Age': 'mean', 'Salary': 'mean'})
print("\n按城市聚合的数据:")
print(aggregated)
# 对年龄应用多个聚合函数,对薪水应用单个聚合函数
multi_aggregated = grouped.agg({'Age': ['mean', 'max'], 'Salary': 'sum'})
print("\n多重聚合的数据:")
print(multi_aggregated)
# 标准化薪水(每个城市内部的标准化)
df['Standardized_Salary'] = grouped['Salary'].transform(lambda x: (x - x.mean()) / x.std())
print("\n标准化薪水后的数据帧:")
print(df)
# 过滤掉平均薪水低于75000的城市
filtered = grouped.filter(lambda x: x['Salary'].mean() > 75000)
print("\n过滤后的数据帧:")
print(filtered)
可以将上面的代码复制到你的IDE中运行,观察程序的输出。这个案例综合了数据聚合与分组的基本知识,帮助你理解和掌握这些操作。继续加油,学习Python会越来越有趣和有用!