如何按预定义列表对DataFrame的ticker列排序并保留时间顺序?
嘿,这个需求我经常碰到,给你捋捋怎么实现最靠谱:
实现思路
核心是利用 Pandas 的**分类数据类型(Categorical)**来指定自定义的 ticker 排序优先级,这样在排序时会严格遵循你定义的顺序,同时每个 ticker 内部保留原始的时间顺序。
具体代码步骤
先还原你的原始 DataFrame(补全了截断的 BOC 数据):
import pandas as pd # 原始数据 data = { 'date': ['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-01', '2018-01-02', '2018-01-03'], 'price': [1.323, 1.525, 1.045, 2.110, 2.150, 2.810], 'ticker': ['AI', 'AI', 'AI', 'BOC', 'BOC', 'BOC'], 'volume': [2000, 1500, 500, 3201, 5200, 4800] } df = pd.DataFrame(data)
接下来分两步操作:
- 将 ticker 列转为分类类型,绑定自定义顺序
# 你的预定义 ticker 顺序 custom_ticker_order = ["CAT", "AI", "BOC"] # 把 ticker 列转为分类,指定顺序并开启排序优先级 df['ticker'] = pd.Categorical(df['ticker'], categories=custom_ticker_order, ordered=True)
- 按 ticker(自定义顺序)+ date(时间顺序)排序
# 先按自定义的 ticker 顺序分组,再按日期保持时间序列 sorted_df = df.sort_values(by=['ticker', 'date'])
验证结果
打印 sorted_df 会得到这样的输出(因为原始数据没有 CAT 的记录,所以直接展示 AI 和 BOC 的部分):
date price ticker volume 0 2018-01-01 1.323 AI 2000 1 2018-01-02 1.525 AI 1500 2 2018-01-03 1.045 AI 500 3 2018-01-01 2.110 BOC 3201 4 2018-01-02 2.150 BOC 5200 5 2018-01-03 2.810 BOC 4800
补充小提示
- 如果你的
date列还不是日期格式,建议先转换:df['date'] = pd.to_datetime(df['date']),避免字符串排序可能出现的问题。 - 如果后续不需要分类类型,可转回普通字符串:
sorted_df['ticker'] = sorted_df['ticker'].astype(str)
内容的提问来源于stack exchange,提问作者cqstack
相关产品推荐
相关产品推荐

