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

时间:2018-05-03 19:07:08

标签: 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 

我试图计算运行中第一支蜡烛的开启与运行中最后一支蜡烛的平仓之间的差值的绝对值,并将差值应用于每条线。结果看起来像

    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()但这并不允许我应用原始数据框的每行差异。

1 个答案:

答案 0 :(得分:2)

您在寻找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