[英]How to effectively loop within groups in pandas?
我有一張這樣的桌子
import pandas as pd
import numpy as np
df = pd.DataFrame.from_dict({'date':[1,2,3,4,5,6,7,8,9,10] ,'high':[10,9,8,8,7,6,7,8,9,10],'low':[9,7,6,5,2,1,2,1,8,9],'stock':['A']*5 + ['B']*5})
日期 | 高的 | 低的 | 股票 |
---|---|---|---|
1個 | 10 | 9 | 一種 |
2個 | 9 | 7 | 一種 |
3個 | 8個 | 6個 | 一種 |
4個 | 8個 | 5個 | 一種 |
5個 | 7 | 2個 | 一種 |
6個 | 6個 | 1個 | 乙 |
7 | 7 | 2個 | 乙 |
8個 | 8個 | 1個 | 乙 |
9 | 9 | 8個 | 乙 |
10 | 10 | 9 | 乙 |
對於每只股票的每一天,我想知道今天的“高點”和低點(之后或今天)之間的最大差異是多少。 例如,在日期 1,股票 A 的最高價為 10 美元。 我查看日期 1-5,發現高價和低價之間的最大差異出現在日期 5。日期 1 的結果將是 10-2=8。在日期 2,我應該只查看日期 2 之后的“低”。
結果:
日期 | 高的 | 低的 | 股票 | 差異高低 |
---|---|---|---|---|
1個 | 10 | 9 | 一種 | 8個 |
2個 | 9 | 7 | 一種 | 7 |
3個 | 8個 | 6個 | 一種 | 6個 |
4個 | 8個 | 5個 | 一種 | 6個 |
5個 | 7 | 2個 | 一種 | 5個 |
6個 | 6個 | 1個 | 乙 | 5個 |
7 | 7 | 2個 | 乙 | 6個 |
8個 | 8個 | 1個 | 乙 | 7 |
9 | 9 | 8個 | 乙 | 1個 |
10 | 10 | 9 | 乙 | 1個 |
我目前正在使用 for 循環並且它有效。 在我的 100 萬多行表上它真的很慢。 有更好的方法嗎?
我目前的方法:
diff_high_low=[]
for gname, g in df.groupby('stock'):
rows = g.shape[0]
for i in range(0,rows):
diff_high_low.append(max( g['high'].iloc[i] - g['low'].iloc[i:rows,]))
df['diff_high_low'] = diff_high_low
我們需要groupby
和cummin
df['diff_high_low'] = df['high'] - df.iloc[::-1].groupby('stock')['low'].cummin()
Out[273]:
0 8
1 7
2 6
3 6
4 5
5 5
6 6
7 7
8 1
9 1
dtype: int64
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.