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

wen python案例 1

Python数据排序精讲:Pandas核心操作与实战案例

目录导读

  1. 为什么Pandas排序是数据分析的基础?
  2. 数据准备:从CSV到DataFrame
  3. 单列排序:.sort_values()的三种模式
  4. 多列排序:复合条件与优先级
  5. 索引排序:.sort_index()的隐藏技巧
  6. 实战案例:销售数据排序与TopN分析
  7. 常见问题与性能优化
  8. Q&A:排序中的陷阱与解决方案

为什么Pandas排序是数据分析的基础?

在数据处理中,排序不仅是为了“好看”,它服务于:

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

  • 快速定位极值:找出销量最高的产品、最活跃的用户
  • 时间序列对齐:按时间戳排序后处理缺失值
  • 分组比较:排序后使用groupby可更高效执行窗口函数
  • 数据可视化准备:排序后的数据绘制柱状图更清晰

问答:Q:sort_valuessort_index什么时候用? A:按列的值(如价格)排序用sort_values;按行索引排序用sort_index,注意:输入顺序不等于索引顺序,排序可重置索引。


数据准备:从CSV到DataFrame

我们使用模拟的电商订单数据(包含100条记录)作为案例:

import pandas as pd
import numpy as np
# 生成示例数据
np.random.seed(42)
df = pd.DataFrame({
    'order_id': range(1, 101),
    'product': np.random.choice(['手机', '电脑', '耳机', '键盘'], 100),
    'price': np.random.randint(100, 5000, 100),
    'quantity': np.random.randint(1, 10, 100),
    'date': pd.date_range('2024-01-01', periods=100, freq='D')
})
df['total'] = df['price'] * df['quantity']
df.to_csv('orders.csv', index=False)
df = pd.read_csv('orders.csv', parse_dates=['date'])

单列排序:.sort_values()的三种模式

1 升序降序

# 按总价升序(默认)
df_sorted = df.sort_values('total')
# 按总价降序
df_sorted_desc = df.sort_values('total', ascending=False)

2 处理缺失值

# 假设某些订单缺失价格,用na_position控制残缺行位置
df_miss = df.copy()
df_miss.loc[0, 'price'] = np.nan
sorted_miss = df_miss.sort_values('price', na_position='first')  # 缺失排最前

3 inplace原地修改

# 直接修改原DataFrame(速度快,但会丢失原始顺序)
df.sort_values('total', inplace=True)

问答:Q:sort_values后索引会乱序,如何重置? A:添加ignore_index=True,新索引从0开始连续。df.sort_values('total', ignore_index=True)


多列排序:复合条件与优先级

1 指定多个排序键

业务需求:先按“产品类别”升序,同类别内按“销售额”降序。

df_sorted = df.sort_values(
    ['product', 'total'],
    ascending=[True, False]  # 产品升序,销售额降序
)

2 按字符串长度排序(按键函数)

# 按产品名的字符长度排序(短→长)
df['name_len'] = df['product'].str.len()
df.sort_values('name_len').head(3)

3 自定义排序顺序

比如希望“耳机>手机>电脑>键盘”的优先级:

custom_order = {'耳机': 0, '手机': 1, '电脑': 2, '键盘': 3}
df['sort_key'] = df['product'].map(custom_order)
df_sorted = df.sort_values('sort_key').drop('sort_key', axis=1)

索引排序:.sort_index()的隐藏技巧

1 按行索引排序

# 原始DataFrame索引被扰乱后
df_shuffled = df.sample(frac=1).reset_index(drop=True)
df_shuffled.sort_index(inplace=True)  # 恢复原始顺序

2 按列名排序(axis=1)

# 列顺序变成:date, order_id, price...
df_sorted_cols = df.sort_index(axis=1)

3 多级索引排序

# 创建多级索引(年级+班级)
multi = df.set_index(['product', 'date'])
sorted_multi = multi.sort_index(level=['product', 'date'])  # 按索引层次排序

实战案例:销售数据排序与TopN分析

案例:找出每个产品类别中销售额最高的TOP3订单

# 方案1:分组+排序+切片
top3_per_product = (
    df.groupby('product', group_keys=False)
    .apply(lambda x: x.sort_values('total', ascending=False).head(3))
)
# 方案2:用nlargest(更高效)
top3_nlargest = df.groupby('product')['total'].nlargest(3).reset_index(level=0, drop=False)

输出示例:

product   order_id   total
手机       45         45000
手机       22         38000
手机       9          32000
电脑       78         98000
...

性能对比:

  • 方案1(groupby+apply):适合小数据集(<10万行)
  • 方案2(nlargest):底层用C算法,内存友好,推荐大数据

常见问题与性能优化

1 排序后的数据怎么保持稳定?

df.sort_values('price', kind='mergesort')  # 稳定排序,相等时保留原序

2 排序时内存不足怎么办?

  • 使用dtype减少内存:df['price'] = df['price'].astype('int32')
  • 分块排序:pd.read_csv('big.csv', chunksize=50000)分批处理

3 排序后合并数据出错?

原因:排序改变了索引,merge默认按索引匹配。
解决方案:排序后重置索引,或指定合并列:pd.merge(df1, df2, on='order_id')


Q&A:排序中的陷阱与解决方案

Q1sort_values对字符串排序是字母排序还是拼音排序?
A:默认按Unicode码点排序,中文按拼音需先转拼音:df.sort_values('name', key=lambda x: x.str.encode('pinyin'))

Q2:排序后head()仍然慢?
A:可结合nlargest/nsmallest直接取TopN,避免全排序:df.nlargest(10, 'total')

Q3:如何实现复杂的业务排序规则(如:A字段升序,但优先级比B字段高)?
A:可创建排名列:df['rank'] = df['A'].rank(method='dense') * 1000 + df['B'].rank()

Q4:排序后iloc取值出错?
A:排序后索引未重置,df.iloc[0]仍然取原第一行,应使用df.iloc[0]配合reset_index(drop=True)


Pandas排序是数据清洗和特征工程的基石,记住三个核心点:

  • 数值列排序直接用ascending参数
  • 复杂业务逻辑通过“键函数”或“辅助列”实现
  • 大数据集优先用nlargest/nsmallest或分区排序

如果你在排序中遇到索引错乱或合并数据问题,99%是因为忘记重置索引,养成sort_values后加reset_index(drop=True)的好习惯,能避免大量调试时间。

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