【问题标题】:Pandas difference between first and last grouped by consecutive eventsPandas 按连续事件分组的第一个和最后一个之间的差异
【发布时间】:2018-10-14 04:39:55
【问题描述】:

我有一个数据框,其中包含开盘/收盘、蜡烛颜色和连续蜡烛的数量。

    date open close color  run
00:01:00  100   102     g    1
00:02:00  102   104     g    2
00:03:00  104   106     g    3
00:04:00  106   105     r    1
00:05:00  105   101     r    2
00:06:00  101   102     g    1  
00:06:00  102   103     g    2 

我正在尝试计算运行中第一根蜡烛的开盘价和运行中最后一根蜡烛的收盘价之间的差值的绝对值,并将差值应用于每条线。结果看起来像

    date open close color  run  run_length
00:01:00  100   102     g    1      2        # abs(100 - 102)
00:02:00  102   104     g    2      4        # abs(100 - 104)
00:03:00  104   106     g    3      6        # abs(100 - 106)
00:04:00  106   105     r    1      1        # abs(106 - 105)
00:05:00  105   101     r    2      5        # abs(106 - 101)
00:06:00  101   102     g    1      1        # abs(101 - 102)
00:06:00  102   103     g    2      2        # abs(101 - 103)

我已经阅读了另外两篇接近但没有完全找到我正在寻找的解决方案的帖子:

get first and last values in a groupby

Pandas number of consecutive occurrences in previous rows

我使用df.groupby((df['color'] != df['color'].shift()).cumsum()) 按蜡烛的颜色对行进行分组(这是我计算颜色和运行次数的方法),我可以使用.agg(['first', 'last']).stack() 获得组的第一个和最后一个值,但是这不允许我应用原始数据帧的每行差异。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您在寻找groupby 吗?为了更加稳健,请遵循 cmets 中 @Wen 的建议,使用 cumsum 技巧执行 groupby

    df['run_length'] = df.groupby(
        df['color'].ne(df['color'].shift()).cumsum()
    ).open.transform('first').sub(df.close).abs()
    
    df    
           date  open  close color  run  run_length
    0  00:01:00   100    102     g    1           2
    1  00:02:00   102    104     g    2           4
    2  00:03:00   104    106     g    3           6
    3  00:04:00   106    105     r    1           1
    4  00:05:00   105    101     r    2           5
    5  00:06:00   101    102     g    1           1
    6  00:06:00   102    103     g    2           2
    

    【讨论】:

    • (df['color'] != df['color'].shift()).cumsum() groupby this :-)
    • @Wen 真棒,没想到,非常感谢!
    猜你喜欢
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多