按连续事件分组的第一个和最后一个熊猫之间的差异

Mic*_*and 5 python pandas

我有一个包含打开/关闭、蜡烛颜色和连续蜡烛数量的数据框。

    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 
Run Code Online (Sandbox Code Playgroud)

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

    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)
Run Code Online (Sandbox Code Playgroud)

我已经阅读了另外两篇接近但不太了解我正在寻找的解决方案的帖子:

获取 groupby 中的第一个和最后一个值

Pandas 前一行中连续出现的次数

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

cs9*_*s95 3

您在寻找吗groupby?为了更加稳健,请按照评论中@Wen的建议,执行groupby使用cumsum技巧:

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
Run Code Online (Sandbox Code Playgroud)

  • `(df['color'] != df['color'].shift()).cumsum()` groupby 这个:-) (4认同)