Javide:
パンダ1.0を使用して、私は私のデータセット内の指定のアイテムの各観察のための実行中の最大値を(各項目は、同じIDで識別される)を計算するための効率的なプログラムを記述しようとしています。私のプログラムは、私はiterrowsを使用して()とインデックスを介して高水位標を設定していますという事実に、非常にゆっくりとしたペースで仕事をしていません。非常に大規模なデータセットを持って、これは実行可能な解決策ではありません。
import pandas as pd
import sys
data = [[1, 10],
[1, 15],
[1, 10],
[1, 0],
[1, 5],
[1, 20],
[1, 0],
[1, 10],
[2, 5],
[2, 15],
[2, 10],
[2, 20],
[2, 25],
[2, 20],
[2, 30],
[2, 10]]
df = pd.DataFrame(data, columns=['id', 'val'])
high_water_mark = -sys.maxsize
previous_row = None
for index, row in df.iterrows():
current_val = row['val']
if index == 0:
df.loc[index, 'running_maximum'] = current_val
high_water_mark = current_val
previous_row = row
continue
if row['id'] == previous_row['id'].item():
if current_val > high_water_mark:
df.loc[index, 'running_maximum'] = current_val
high_water_mark = current_val
else:
df.loc[index, 'running_maximum'] = high_water_mark
else:
df.loc[index, 'running_maximum'] = current_val
high_water_mark = current_val
previous_row = row
print(df)
出力:
id val running_maximum
0 1 10 10.0
1 1 15 15.0
2 1 10 15.0
3 1 0 15.0
4 1 5 15.0
5 1 20 20.0
6 1 0 20.0
7 1 10 20.0
8 2 5 5.0
9 2 15 15.0
10 2 10 15.0
11 2 20 20.0
12 2 25 25.0
13 2 20 25.0
14 2 30 30.0
15 2 10 30.0
このプロセスをスピードアップする方法についての任意の提案ですか?
オリジナル:
あなたは持っているGroupBy.cummax
まさにそのいます。
df['running_maximum'] = df.groupby('id').val.cummax()
print(df)
id val running_maximum
0 1 10 10
1 1 15 15
2 1 10 15
3 1 0 15
4 1 5 15
5 1 20 20
6 1 0 20
7 1 10 20
8 2 5 5
9 2 15 15
10 2 10 15
11 2 20 20
12 2 25 25
13 2 20 25
14 2 30 30
15 2 10 30
各グループ(このサンプルのように)同じ値の量を持っている場合、我々はでnumpyのを使用して、これをスピードアップすることができますnp.maximum.accumulate
。
df['running_maximum'] = np.maximum.accumulate(df.val.values.reshape(-1, 8), 1).ravel()