Python案例如何用Pandas做数据分组重排序

wen python案例 2

本文目录导读:

Python案例如何用Pandas做数据分组重排序

  1. 基础准备
  2. 分组后排序的几种方法
  3. 更复杂的排序场景
  4. 实用案例:销售数据分析
  5. 高级技巧:自定义排序规则
  6. 完整示例代码

我来给你一个完整的Pandas数据分组重排序案例,包含几种常见场景:

基础准备

import pandas as pd
import numpy as np
# 创建示例数据
data = {
    '部门': ['技术部', '市场部', '技术部', '人事部', '市场部', '技术部', '人事部', '市场部'],
    '姓名': ['张三', '李四', '王五', '赵六', '孙七', '周八', '吴九', '郑十'],
    '工资': [15000, 12000, 18000, 10000, 13000, 16000, 11000, 14000],
    '年龄': [28, 32, 25, 35, 29, 31, 27, 33]
}
df = pd.DataFrame(data)
print("原始数据:")
print(df)

分组后排序的几种方法

方法1:对分组结果进行排序

# 按部门分组,然后对每个组内的工资排序
df_grouped = df.groupby('部门').apply(lambda x: x.sort_values('工资', ascending=False))
df_grouped = df_grouped.reset_index(drop=True)
print("各部门按工资降序:")
print(df_grouped)

方法2:使用sort_values配合分组

# 先按部门分组,再按工资排序
df_sorted = df.groupby('部门', group_keys=False).apply(lambda x: x.sort_values('工资'))
print("各部门按工资升序:")
print(df_sorted)

方法3:使用rank()排名

# 在各组内添加排名
df_copy = df.copy()
df_copy['工资排名'] = df_copy.groupby('部门')['工资'].rank(method='dense', ascending=False)
df_sorted_rank = df_copy.sort_values(['部门', '工资排名'])
print("带排名的分组排序:")
print(df_sorted_rank)

更复杂的排序场景

按多个条件分组排序

# 按部门分组,先按工资降序,再按年龄升序
df_multi_sort = df.groupby('部门', group_keys=False).apply(
    lambda x: x.sort_values(['工资', '年龄'], ascending=[False, True])
)
print("多条件排序(工资降序+年龄升序):")
print(df_multi_sort)

统计分组后的排序

# 计算各部门的平均工资,然后排序
dept_stats = df.groupby('部门').agg({
    '工资': ['mean', 'sum', 'count'],
    '年龄': 'mean'
}).round(2)
dept_stats.columns = ['平均工资', '工资总额', '人数', '平均年龄']
dept_stats_sorted = dept_stats.sort_values('平均工资', ascending=False)
print("各部门统计(按平均工资降序):")
print(dept_stats_sorted)

实用案例:销售数据分析

# 模拟销售数据
sales_data = {
    '销售员': ['张三', '张三', '李四', '李四', '王五', '王五', '张三'],
    '月份': [1, 2, 1, 2, 1, 2, 3],
    '销售额': [10000, 15000, 12000, 18000, 9000, 16000, 20000],
    '产品': ['A', 'B', 'A', 'B', 'A', 'B', 'A']
}
sales_df = pd.DataFrame(sales_data)
print("销售数据:")
print(sales_df)
# 每个销售员按销售额排序
sales_sorted = sales_df.groupby('销售员', group_keys=False).apply(
    lambda x: x.sort_values('销售额', ascending=False)
)
print("\n各销售员销售额排序(降序):")
print(sales_sorted)
# 找出各销售员最高销售额的月份
top_sales = sales_df.groupby('销售员').apply(
    lambda x: x.loc[x['销售额'].idxmax()]
)
print("\n各销售员最佳月份:")
print(top_sales)

高级技巧:自定义排序规则

# 自定义排序顺序
custom_order = ['人事部', '市场部', '技术部']
df['部门排序'] = pd.Categorical(df['部门'], categories=custom_order, ordered=True)
# 按自定义顺序和工资排序
df_custom = df.sort_values(['部门排序', '工资'], ascending=[True, False])
print("自定义部门顺序排序:")
print(df_custom[['部门', '姓名', '工资']])

完整示例代码

import pandas as pd
def demo_group_sort():
    """
    Pandas分组排序完整演示
    """
    # 创建示例数据
    data = {
        '部门': ['技术部', '市场部', '技术部', '人事部', '市场部', '技术部', '人事部', '市场部'],
        '姓名': ['张三', '李四', '王五', '赵六', '孙七', '周八', '吴九', '郑十'],
        '工资': [15000, 12000, 18000, 10000, 13000, 16000, 11000, 14000],
        '年龄': [28, 32, 25, 35, 29, 31, 27, 33]
    }
    df = pd.DataFrame(data)
    # 方法1:分组内排序
    result1 = df.groupby('部门').apply(lambda x: x.sort_values('工资', ascending=False))
    result1 = result1.reset_index(drop=True)
    # 方法2:分组后排名
    df['组内排名'] = df.groupby('部门')['工资'].rank(method='dense', ascending=False)
    result2 = df.sort_values(['部门', '组内排名'])
    # 方法3:多条件排序
    result3 = df.groupby('部门', group_keys=False).apply(
        lambda x: x.sort_values(['工资', '年龄'], ascending=[False, True])
    )
    return result1, result2, result3
# 运行演示
result1, result2, result3 = demo_group_sort()
print("方法1 - 组内排序:")
print(result1)
print("\n方法2 - 组内排名:")
print(result2)
print("\n方法3 - 多条件排序:")
print(result3)

这些方法覆盖了Pandas数据分组重排序的主要场景,你可以根据实际需求选择合适的方法。

抱歉,评论功能暂时关闭!