简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français

站内搜索

搜索

活动公告

11-02 12:46
10-23 09:32
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,将及时处理!
10-23 09:31
10-23 09:28
通知:签到时间调整为每日4:00(东八区)
10-23 09:26

掌握pandas排列输出技巧让数据分析结果更直观易懂提升工作效率

3万

主题

312

科技点

3万

积分

大区版主

木柜子打湿

积分
31893

财Doro三倍冰淇淋无人之境【一阶】立华奏小樱(小丑装)⑨的冰沙以外的星空【二阶】

发表于 2025-10-4 00:40:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

在数据分析和处理过程中,pandas作为Python生态中最核心的数据处理库,其强大的数据操作能力为数据分析师和科学家提供了极大的便利。然而,仅仅掌握基础的数据操作是不够的,如何将分析结果以直观、易懂的方式呈现出来,是提升工作效率和沟通效果的关键。本文将深入探讨pandas中的排列输出技巧,帮助你更好地展示数据,提升数据分析的整体效率。

pandas基础排序方法

sort_values()方法

sort_values()是pandas中最常用的排序方法,它可以根据一个或多个列的值对DataFrame进行排序。
  1. import pandas as pd
  2. import numpy as np
  3. # 创建示例DataFrame
  4. data = {
  5.     '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
  6.     '年龄': [28, 34, 29, 45, 22],
  7.     '薪资': [15000, 20000, 18000, 30000, 12000],
  8.     '部门': ['技术', '市场', '技术', '管理', '技术']
  9. }
  10. df = pd.DataFrame(data)
  11. # 按年龄升序排序
  12. df_sorted_by_age = df.sort_values(by='年龄')
  13. print("按年龄升序排序:")
  14. print(df_sorted_by_age)
  15. # 按薪资降序排序
  16. df_sorted_by_salary = df.sort_values(by='薪资', ascending=False)
  17. print("\n按薪资降序排序:")
  18. print(df_sorted_by_salary)
  19. # 先按部门升序,再按薪资降序排序
  20. df_sorted_multi = df.sort_values(by=['部门', '薪资'], ascending=[True, False])
  21. print("\n多列排序(部门升序,薪资降序):")
  22. print(df_sorted_multi)
复制代码

sort_index()方法

sort_index()方法用于根据行索引或列索引进行排序。
  1. # 创建一个无序索引的DataFrame
  2. df_unordered = pd.DataFrame({
  3.     'A': np.random.randn(5),
  4.     'B': np.random.randn(5)
  5. }, index=[3, 1, 4, 0, 2])
  6. # 按行索引升序排序
  7. df_sorted_index = df_unordered.sort_index()
  8. print("按行索引升序排序:")
  9. print(df_sorted_index)
  10. # 按行索引降序排序
  11. df_sorted_index_desc = df_unordered.sort_index(ascending=False)
  12. print("\n按行索引降序排序:")
  13. print(df_sorted_index_desc)
  14. # 按列名排序
  15. df_sorted_columns = df_unordered.sort_index(axis=1)
  16. print("\n按列名排序:")
  17. print(df_sorted_columns)
复制代码

高级排列技巧

nlargest()和nsmallest()方法

当你只需要获取最大或最小的几个值时,nlargest()和nsmallest()方法比完整排序更高效。
  1. # 获取薪资最高的3个人
  2. top_3_salaries = df.nlargest(3, '薪资')
  3. print("薪资最高的3个人:")
  4. print(top_3_salaries)
  5. # 获取年龄最小的2个人
  6. youngest_2 = df.nsmallest(2, '年龄')
  7. print("\n年龄最小的2个人:")
  8. print(youngest_2)
复制代码

按自定义顺序排序

有时候,我们需要按照特定的非字母或非数字顺序进行排序,这时可以使用Categorical类型。
  1. # 创建示例DataFrame
  2. df_dept = pd.DataFrame({
  3.     '员工': ['张三', '李四', '王五', '赵六', '钱七'],
  4.     '绩效等级': ['B', 'A', 'C', 'A+', 'B+']
  5. })
  6. # 定义绩效等级的自定义顺序
  7. performance_order = ['C', 'B', 'B+', 'A', 'A+']
  8. # 将绩效等级转换为Categorical类型,并指定顺序
  9. df_dept['绩效等级'] = pd.Categorical(
  10.     df_dept['绩效等级'],
  11.     categories=performance_order,
  12.     ordered=True
  13. )
  14. # 按自定义绩效等级排序
  15. df_sorted_performance = df_dept.sort_values('绩效等级')
  16. print("按自定义绩效等级排序:")
  17. print(df_sorted_performance)
复制代码

分组后的排序

在数据分析中,我们经常需要对分组后的数据进行排序,以获取每个组中的特定信息。
  1. # 创建更大的示例数据集
  2. np.random.seed(42)
  3. big_data = {
  4.     '部门': np.random.choice(['技术', '市场', '财务', '人力'], 100),
  5.     '员工': [f'员工{i}' for i in range(1, 101)],
  6.     '销售额': np.random.randint(1000, 10000, 100),
  7.     '工作年限': np.random.randint(1, 10, 100)
  8. }
  9. big_df = pd.DataFrame(big_data)
  10. # 按部门分组,并获取每个部门销售额最高的员工
  11. top_performers = big_df.groupby('部门').apply(
  12.     lambda x: x.nlargest(2, '销售额')
  13. ).reset_index(drop=True)
  14. print("各部门销售额最高的2名员工:")
  15. print(top_performers)
  16. # 按部门分组,并计算每个部门的平均销售额,然后按平均销售额排序
  17. dept_avg_sales = big_df.groupby('部门')['销售额'].mean().sort_values(ascending=False)
  18. print("\n各部门平均销售额排序:")
  19. print(dept_avg_sales)
复制代码

自定义输出格式

设置显示选项

pandas提供了多种选项来自定义数据的显示方式,使其更符合我们的需求。
  1. # 获取当前的显示选项
  2. print("当前最大显示行数:", pd.get_option('display.max_rows'))
  3. print("当前最大显示列数:", pd.get_option('display.max_columns'))
  4. # 设置显示选项
  5. pd.set_option('display.max_rows', 20)  # 最多显示20行
  6. pd.set_option('display.max_columns', 10)  # 最多显示10列
  7. pd.set_option('display.width', 100)  # 显示宽度为100字符
  8. pd.set_option('display.precision', 2)  # 浮点数精度为2
  9. pd.set_option('display.float_format', '{:,.2f}'.format)  # 浮点数格式化
  10. # 创建一个包含大量数据的DataFrame
  11. large_df = pd.DataFrame(np.random.randn(20, 8), columns=[f'列{i}' for i in range(1, 9)])
  12. print("\n自定义显示选项后的DataFrame:")
  13. print(large_df)
  14. # 恢复默认设置
  15. pd.reset_option('all')
复制代码

使用style属性美化输出

pandas的style属性提供了丰富的数据可视化选项,可以帮助我们创建更美观的表格。
  1. # 创建示例数据
  2. sales_data = {
  3.     '产品': ['产品A', '产品B', '产品C', '产品D', '产品E'],
  4.     'Q1': [12000, 15000, 8000, 18000, 10000],
  5.     'Q2': [14000, 16000, 8500, 17000, 12000],
  6.     'Q3': [13000, 15500, 9000, 19000, 11000],
  7.     'Q4': [15000, 16500, 9500, 20000, 13000]
  8. }
  9. sales_df = pd.DataFrame(sales_data)
  10. # 使用style属性美化表格
  11. styled_df = (
  12.     sales_df.style
  13.     .background_gradient(cmap='Blues')  # 添加背景渐变色
  14.     .highlight_max(axis=0)  # 高亮每列的最大值
  15.     .format({'Q1': '${:,.0f}', 'Q2': '${:,.0f}', 'Q3': '${:,.0f}', 'Q4': '${:,.0f}'})  # 格式化数字
  16.     .set_caption('产品季度销售额')  # 添加标题
  17.     .set_properties(**{'text-align': 'center'})  # 设置文本居中
  18. )
  19. # 显示美化的表格
  20. styled_df
复制代码

条件格式化

条件格式化可以帮助我们根据数据的值来应用不同的样式,使数据中的模式和异常更加明显。
  1. # 创建示例数据
  2. student_data = {
  3.     '姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],
  4.     '语文': [85, 92, 78, 65, 88, 95],
  5.     '数学': [90, 88, 82, 70, 85, 98],
  6.     '英语': [80, 85, 75, 60, 90, 92],
  7.     '综合': [87, 90, 80, 68, 86, 96]
  8. }
  9. student_df = pd.DataFrame(student_data)
  10. # 设置条件格式化
  11. styled_student = (
  12.     student_df.style
  13.     .hide_index()  # 隐藏索引
  14.     .set_caption('学生成绩表')  # 添加标题
  15.     .applymap(lambda x: 'color: red' if x < 70 else 'color: black')  # 分数小于70的标红
  16.     .applymap(lambda x: 'font-weight: bold' if x >= 90 else '')  # 分数大于等于90的加粗
  17.     .background_gradient(cmap='YlOrRd', subset=['语文', '数学', '英语', '综合'])  # 添加背景渐变色
  18.     .format({'语文': '{:.0f}', '数学': '{:.0f}', '英语': '{:.0f}', '综合': '{:.0f}'})  # 格式化数字
  19. )
  20. # 显示条件格式化的表格
  21. styled_student
复制代码

实用案例分析

案例一:销售数据分析与可视化

假设我们是一家零售公司的数据分析师,需要分析各产品的销售情况,并生成一份直观的报告。
  1. # 创建销售数据
  2. np.random.seed(42)
  3. months = ['1月', '2月', '3月', '4月', '5月', '6月']
  4. products = ['产品A', '产品B', '产品C', '产品D', '产品E']
  5. sales_data = []
  6. for month in months:
  7.     for product in products:
  8.         sales_data.append({
  9.             '月份': month,
  10.             '产品': product,
  11.             '销售额': np.random.randint(5000, 20000),
  12.             '销售量': np.random.randint(50, 200),
  13.             '客户满意度': np.random.uniform(3.5, 5.0)
  14.         })
  15. sales_df = pd.DataFrame(sales_data)
  16. # 计算每个产品的总销售额和平均客户满意度
  17. product_summary = sales_df.groupby('产品').agg({
  18.     '销售额': 'sum',
  19.     '销售量': 'sum',
  20.     '客户满意度': 'mean'
  21. }).reset_index()
  22. # 按总销售额降序排序
  23. product_summary = product_summary.sort_values('销售额', ascending=False)
  24. # 美化输出
  25. styled_product_summary = (
  26.     product_summary.style
  27.     .background_gradient(cmap='Blues', subset=['销售额', '销售量'])
  28.     .background_gradient(cmap='Greens', subset=['客户满意度'])
  29.     .format({
  30.         '销售额': '${:,.0f}',
  31.         '销售量': '{:,}件',
  32.         '客户满意度': '{:.2f}'
  33.     })
  34.     .set_caption('产品销售汇总表')
  35.     .hide_index()
  36. )
  37. styled_product_summary
  38. # 计算每月的销售总额
  39. monthly_sales = sales_df.groupby('月份')['销售额'].sum().reset_index()
  40. # 确保月份按正确顺序排序
  41. monthly_sales['月份'] = pd.Categorical(
  42.     monthly_sales['月份'],
  43.     categories=months,
  44.     ordered=True
  45. )
  46. monthly_sales = monthly_sales.sort_values('月份')
  47. # 美化输出
  48. styled_monthly_sales = (
  49.     monthly_sales.style
  50.     .background_gradient(cmap='Reds')
  51.     .format({'销售额': '${:,.0f}'})
  52.     .set_caption('月度销售总额')
  53.     .hide_index()
  54. )
  55. styled_monthly_sales
复制代码

案例二:多维度数据分析与展示

在这个案例中,我们将分析一个包含多个维度的数据集,并通过不同的排序和展示方式来发现数据中的模式。
  1. # 创建多维度数据集
  2. np.random.seed(42)
  3. regions = ['华东', '华南', '华北', '西南', '西北']
  4. categories = ['电子产品', '服装', '食品', '家居', '图书']
  5. quarters = ['Q1', 'Q2', 'Q3', 'Q4']
  6. multi_dim_data = []
  7. for region in regions:
  8.     for category in categories:
  9.         for quarter in quarters:
  10.             multi_dim_data.append({
  11.                 '地区': region,
  12.                 '类别': category,
  13.                 '季度': quarter,
  14.                 '销售额': np.random.randint(10000, 100000),
  15.                 '利润': np.random.randint(1000, 20000),
  16.                 '客户数': np.random.randint(100, 1000),
  17.                 '满意度': np.random.uniform(3.0, 5.0)
  18.             })
  19. multi_dim_df = pd.DataFrame(multi_dim_data)
  20. # 计算利润率
  21. multi_dim_df['利润率'] = multi_dim_df['利润'] / multi_dim_df['销售额']
  22. # 分析各地区总销售额和平均利润率
  23. region_analysis = multi_dim_df.groupby('地区').agg({
  24.     '销售额': 'sum',
  25.     '利润': 'sum',
  26.     '利润率': 'mean',
  27.     '客户数': 'sum',
  28.     '满意度': 'mean'
  29. }).reset_index()
  30. # 按销售额降序排序
  31. region_analysis = region_analysis.sort_values('销售额', ascending=False)
  32. # 美化输出
  33. styled_region = (
  34.     region_analysis.style
  35.     .background_gradient(cmap='Blues', subset=['销售额', '利润'])
  36.     .background_gradient(cmap='Greens', subset=['利润率'])
  37.     .background_gradient(cmap='Reds', subset=['客户数'])
  38.     .background_gradient(cmap='Purples', subset=['满意度'])
  39.     .format({
  40.         '销售额': '${:,.0f}',
  41.         '利润': '${:,.0f}',
  42.         '利润率': '{:.2%}',
  43.         '客户数': '{:,}',
  44.         '满意度': '{:.2f}'
  45.     })
  46.     .set_caption('地区销售分析')
  47.     .hide_index()
  48. )
  49. styled_region
  50. # 分析各类别在各季度的表现
  51. category_quarter = multi_dim_df.pivot_table(
  52.     index='类别',
  53.     columns='季度',
  54.     values='销售额',
  55.     aggfunc='sum'
  56. )
  57. # 按总销售额降序排序类别
  58. category_quarter['总计'] = category_quarter.sum(axis=1)
  59. category_quarter = category_quarter.sort_values('总计', ascending=False)
  60. category_quarter = category_quarter.drop('总计', axis=1)
  61. # 美化输出
  62. styled_category_quarter = (
  63.     category_quarter.style
  64.     .background_gradient(cmap='Blues', axis=1)
  65.     .format('${:,.0f}')
  66.     .set_caption('各类别季度销售额')
  67. )
  68. styled_category_quarter
复制代码

性能优化与最佳实践

大数据集的排序技巧

当处理大型数据集时,排序操作可能会变得很慢。以下是一些优化技巧:
  1. # 创建一个大型数据集
  2. large_dataset = pd.DataFrame({
  3.     'id': range(1, 1000001),
  4.     'value': np.random.randn(1000000),
  5.     'category': np.random.choice(['A', 'B', 'C', 'D', 'E'], 1000000),
  6.     'date': pd.date_range('2020-01-01', periods=1000000, freq='H')
  7. })
  8. # 方法1:使用sort_values()进行排序
  9. import time
  10. start_time = time.time()
  11. sorted_large = large_dataset.sort_values('value')
  12. end_time = time.time()
  13. print(f"使用sort_values()排序耗时: {end_time - start_time:.2f}秒")
  14. # 方法2:先转换为Categorical类型再排序(适用于类别型数据)
  15. start_time = time.time()
  16. large_dataset['category'] = large_dataset['category'].astype('category')
  17. sorted_category = large_dataset.sort_values('category')
  18. end_time = time.time()
  19. print(f"转换为Categorical后排序耗时: {end_time - start_time:.2f}秒")
  20. # 方法3:只选择需要的列进行排序
  21. start_time = time.time()
  22. selected_cols = large_dataset[['id', 'value']].sort_values('value')
  23. end_time = time.time()
  24. print(f"选择部分列排序耗时: {end_time - start_time:.2f}秒")
  25. # 方法4:使用nlargest()或nsmallest()获取前N个值
  26. start_time = time.time()
  27. top_1000 = large_dataset.nlargest(1000, 'value')
  28. end_time = time.time()
  29. print(f"使用nlargest()获取前1000条耗时: {end_time - start_time:.2f}秒")
复制代码

内存优化技巧

处理大型数据集时,内存使用是一个重要考虑因素。以下是一些减少内存使用的技巧:
  1. # 检查原始数据集的内存使用
  2. print(f"原始数据集内存使用: {large_dataset.memory_usage(deep=True).sum() / 1024**2:.2f} MB")
  3. # 优化1:转换数据类型以减少内存使用
  4. optimized_dataset = large_dataset.copy()
  5. # 将整数类型转换为更小的类型
  6. optimized_dataset['id'] = optimized_dataset['id'].astype('int32')
  7. # 将浮点数类型转换为更小的类型
  8. optimized_dataset['value'] = optimized_dataset['value'].astype('float32')
  9. # 将字符串类型转换为category类型(当唯一值较少时)
  10. optimized_dataset['category'] = optimized_dataset['category'].astype('category')
  11. print(f"优化后数据集内存使用: {optimized_dataset.memory_usage(deep=True).sum() / 1024**2:.2f} MB")
  12. # 优化2:使用分块处理大型数据集
  13. def process_large_dataset_in_chunks(df, chunk_size=100000):
  14.     chunks = []
  15.     for i in range(0, len(df), chunk_size):
  16.         chunk = df.iloc[i:i+chunk_size]
  17.         # 对每个块进行处理
  18.         processed_chunk = chunk.sort_values('value')
  19.         chunks.append(processed_chunk)
  20.     # 合并所有块
  21.     return pd.concat(chunks)
  22. start_time = time.time()
  23. processed_chunks = process_large_dataset_in_chunks(large_dataset)
  24. end_time = time.time()
  25. print(f"分块处理耗时: {end_time - start_time:.2f}秒")
复制代码

最佳实践总结

1. 选择合适的排序方法:对于简单排序,使用sort_values()对于获取最大/最小值,使用nlargest()/nsmallest()对于按索引排序,使用sort_index()
2. 对于简单排序,使用sort_values()
3. 对于获取最大/最小值,使用nlargest()/nsmallest()
4. 对于按索引排序,使用sort_index()
5. 优化数据类型:将整数转换为适当大小的类型(如int8,int16,int32)将浮点数转换为float32(如果精度允许)将低基数字符串列转换为category类型
6. 将整数转换为适当大小的类型(如int8,int16,int32)
7. 将浮点数转换为float32(如果精度允许)
8. 将低基数字符串列转换为category类型
9. 处理大型数据集:考虑分块处理只选择需要的列进行操作考虑使用Dask或Modin等库处理超大型数据集
10. 考虑分块处理
11. 只选择需要的列进行操作
12. 考虑使用Dask或Modin等库处理超大型数据集
13. 美观输出:使用style属性增强可视化效果应用条件格式化突出重要信息适当格式化数字(如货币、百分比等)
14. 使用style属性增强可视化效果
15. 应用条件格式化突出重要信息
16. 适当格式化数字(如货币、百分比等)

选择合适的排序方法:

• 对于简单排序,使用sort_values()
• 对于获取最大/最小值,使用nlargest()/nsmallest()
• 对于按索引排序,使用sort_index()

优化数据类型:

• 将整数转换为适当大小的类型(如int8,int16,int32)
• 将浮点数转换为float32(如果精度允许)
• 将低基数字符串列转换为category类型

处理大型数据集:

• 考虑分块处理
• 只选择需要的列进行操作
• 考虑使用Dask或Modin等库处理超大型数据集

美观输出:

• 使用style属性增强可视化效果
• 应用条件格式化突出重要信息
• 适当格式化数字(如货币、百分比等)

总结

在数据分析工作中,数据的排列和输出方式直接影响着分析结果的直观性和工作效率。通过掌握pandas中的各种排列输出技巧,我们可以:

1. 更高效地对数据进行排序和筛选,快速找到关键信息
2. 通过美化和格式化输出,使分析结果更加直观易懂
3. 优化处理大型数据集的性能,提高工作效率
4. 创建专业、美观的数据报告,提升沟通效果

本文介绍了从基础的排序方法到高级的排列技巧,从自定义输出格式到实用案例分析,再到性能优化与最佳实践,全面覆盖了pandas排列输出的各个方面。希望这些技巧能够帮助你在日常数据分析工作中更加得心应手,让数据分析结果更加直观易懂,从而提升整体工作效率。

记住,好的数据排列和输出不仅是技术的展示,更是有效沟通的桥梁。在实际应用中,根据具体需求灵活运用这些技巧,才能真正发挥pandas的强大功能。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

频道订阅

频道订阅

加入社群

加入社群

联系我们|TG频道|RSS

Powered by Pixtech

© 2025 Pixtech Team.