我有一个包含开/关,蜡烛颜色和连续蜡烛数的数据框。
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()
但这并不允许我应用原始数据框的每行差异。
答案 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