1

したがって、次の DataFrame df があります。

ここに画像の説明を入力

フレームには、そのグループ内で並べ替えられた 2 つのデータ グループが含まれています。

グループ 1 はインデックス 359 から 365 までです。

グループ 2 はインデックス 366 から 371 までです。

それらを2つのグループに分けたいと思います。2 つ以上のグループがある場合もあります。私が適用しているロジックは、次の STEPS_ID が現在の STEPS_ID より小さい場合はいつでも、これがグループの終わりを示します。

df.STEPS_ID <= df.STEPS_ID.shift(-1) でこのポインターを簡単に取得できます

forループではなくベクトル化された操作を使用して、これを簡単に達成するためのエレガントなパンダの方法はありますか?

これは十分に一般的な問題であるように思われるため、この種の問題を解決するには明確に定義されたアルゴリズムが必要であると確信しています。また、そのようなアルゴリズムの理論的根拠を読む際に私を導いていただければ幸いです。

4

1 に答える 1

4

「物事をグループに分ける」方法は複数あります。1 つの方法は、グループのリストを作成することです。しかし、これは Pandas DataFrame を扱う場合の理想的な方法ではありません。リストを取得したら、Python ループでリストをループする必要があります。これらは、ネイティブの Pandas 操作と比較して比較的低速です。

十分なメモリがあると仮定すると、列またはインデックスを DataFrame に追加することをお勧めします。

import pandas as pd
df = pd.DataFrame({'STEPS_ID':range(1107,1113)*2})
df['GROUP'] = (df['STEPS_ID'] < df['STEPS_ID'].shift(1)).astype('int').cumsum()
# df.set_index('GROUP', inplace=True, append=True)
print(df)

収量

    STEPS_ID  GROUP
0       1107      0
1       1108      0
2       1109      0
3       1110      0
4       1111      0
5       1112      0
6       1107      1
7       1108      1
8       1109      1
9       1110      1
10      1111      1
11      1112      1

呼び出して、各グループで集計/変換操作を実行できるようになりました

df.groupby('GROUP')....
于 2013-09-05T12:36:15.633 に答える