どのように効率的にパンダのデータフレームで最大を実行している計算するには?

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()

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=12958&siteId=1