You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否先反转Pandas DataFrame再执行分组操作以优化现有逻辑?

能否先反转DataFrame再进行分组操作?

原始代码

df = pd.read_csv("some_data.csv")

candles = [Candle(candle["close"].iloc[0], candle["close"].iloc[-1], max(candle["close"]), min(candle["close"]))
           for _, candle in df.groupby(df.index // ticks)]
candles.reverse()

这段代码用于处理tick数据的DataFrame,功能正常但略显繁琐。我的问题是:是否可以先反转DataFrame再进行分组操作?

实际数据片段

timestamp,close,security_code,volume,bid_volume,ask_volume
2024-02-28 01:00:00.358537+00:00,18002.5,NQ,1,0,1
2024-02-28 01:00:00.890809+00:00,18002.75,NQ,1,1,0
2024-02-28 01:00:00.890809+00:00,18002.75,NQ,1,1,0
2024-02-28 01:00:01.696411+00:00,18002.5,NQ,1,0,1
2024-02-28 01:00:02.268716+00:00,18002.25,NQ,1,0,1
2024-02-28 01:00:02.513397+00:00,18002.5,NQ,1,1,0
2024-02-28 01:00:03.716795+00:00,18002.5,NQ,1,0,1
2024-02-28 01:00:03.892441+00:00,18002.75,NQ,1,1,0
2024-02-28 01:00:03.893664+00:00,18002.25,NQ,1,0,1
2024-02-28 01:00:06.956017+00:00,18002.25,NQ,1,0,1
2024-02-28 01:00:08.144158+00:00,18002.25,NQ,1,1,0
2024-02-28 01:00:08.144158+00:00,18002.25,NQ,1,1,0
2024-02-28 01:00:08.772717+00:00,18002.0,NQ,1,0,1
2024-02-28 01:00:08.772717+00:00,18002.0,NQ,3,0,3
2024-02-28 01:00:09.966515+00:00,18002.25,NQ,1,1,0
2024-02-28 01:00:10.051715+00:00,18002.0,NQ,1,0,1
2024-02-28 01:00:11.053980+00:00,18001.75,NQ,1,0,1
2024-02-28 01:00:11.053980+00:00,18001.75,NQ,1,0,1
2024-02-28 01:00:11.296008+00:00,18002.0,NQ,1,1,0
2024-02-28 01:00:12.050765+00:00,18001.75,NQ,1,0,1
2024-02-28 01:00:12.050765+00:00,18001.5,NQ,1,0,1
2024-02-28 01:00:12.050765+00:00,18001.5,NQ,1,0,1
2024-02-28 01:00:12.050765+00:00,18001.5,NQ,1,0,1
2024-02-28 01:00:12.050765+00:00,18001.5,NQ,1,0,1
2024-02-28 01:00:12.050765+00:00,18001.5,NQ,1,0,1
2024-02-28 01:00:12.050765+00:00,18001.25,NQ,1,0,1
2024-02-28 01:00:12.050765+00:00,18001.25,NQ,1,0,1
2024-02-28 01:00:12.050765+00:00,18001.25,NQ,1,0,1
2024-02-28 01:00:12.050765+00:00,18001.25,NQ,2,0,2

当然可以先反转DataFrame再分组,但需要调整分组键的计算逻辑,保证tick分组的正确性。下面提供两种可行的写法:

方法一:先反转DataFrame,再计算对应分组键

反转后必须重置索引,避免原乱序索引干扰分组逻辑。分组键从原数据末尾开始计算,确保分组结果和原代码反转后的效果一致:

df = pd.read_csv("some_data.csv")
# 反转DataFrame并重置索引
df_reversed = df.iloc[::-1].reset_index(drop=True)
# 计算分组键,让反转后的第一个组对应原数据的最后一个组
total_rows = len(df)
group_keys = (total_rows - 1 - df_reversed.index) // ticks
# 直接生成蜡烛图,无需后续反转
candles = [Candle(candle["close"].iloc[0], candle["close"].iloc[-1], max(candle["close"]), min(candle["close"]))
           for _, candle in df_reversed.groupby(group_keys)]

方法二:不反转DataFrame,直接生成倒序分组键

如果不想反转DataFrame,也可以直接生成从数据末尾开始的分组键,分组时关闭排序即可得到倒序的蜡烛图序列:

df = pd.read_csv("some_data.csv")
total_rows = len(df)
# 生成从数据末尾开始的分组键
group_keys = (total_rows - 1 - df.index) // ticks
# 按分组键分组时不排序,直接得到目标序列
candles = [Candle(candle["close"].iloc[0], candle["close"].iloc[-1], max(candle["close"]), min(candle["close"]))
           for _, candle in df.groupby(group_keys, sort=False)]

关键注意点

  • 反转DataFrame后一定要重置索引,否则原索引的顺序会破坏分组逻辑。
  • 分组键的计算(total_rows - 1 - index) // ticks是核心,保证分组结果和原代码candles.reverse()后的效果完全等价。
  • 两种写法都能省去单独的反转步骤,代码更简洁,执行效率和原代码基本一致。

内容的提问来源于stack exchange,提问作者Jan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 08:47:34