能否先反转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
相关产品推荐
相关产品推荐

