前または次の行にインデックスを付けるときに、データフレームの行ループを回避できますか?

ロッキーK

ゼロに達するたびに一意の値を個別に割り当てたいデータセットがあります。

私が思いついたコードは遅いようで、もっと速い方法があるに違いないと思います。

import time
import pandas as pd
import numpy as np

#--------------------------------
#     DEBUG TEST DATASET
#--------------------------------
#Create random test data
series_random = np.random.randint(low=1, high=10, size=(10000,1))

#Insert zeros at known points (this should result in six motion IDs)
series_random[[5,6,7,15,100,2000,5000]] = 0

#Create data frame from test series
df = pd.DataFrame(series_random, columns=['Speed'])
#--------------------------------

#Elaped time counter
Elapsed_ms = time.time()

#Set Motion ID variable
Motion_ID = 0

#Create series with Motion IDs
df.loc[:,'Motion ID'] = 0

#Iterate through each row of df
for i in range(df.index.min()+1, df.index.max()+1):

    #Set Motion ID to latest value
    df.loc[i, 'Motion ID'] = Motion_ID

    #If previous speed was zero and current speed is >0, then new motion detected        
    if df.loc[i-1, 'Speed'] == 0 and df.loc[i, 'Speed'] > 0:
        Motion_ID += 1
        df.loc[i, 'Motion ID'] = Motion_ID

        #Include first zero value in new Motion ID (for plotting purposes)
        df.loc[i-1, 'Motion ID'] = Motion_ID

Elapsed_ms = int((time.time() - Elapsed_ms) * 1000)

print('Result: {} records checked, {} unique trips identified in {} ms'.format(len(df.index),df['Motion ID'].nunique(),Elapsed_ms))

上記のコードからの出力は次のとおりです。

結果:10000レコードがチェックされ、6879ミリ秒で6つの一意のトリップが識別されました

私の実際のデータセットははるかに大きくなるので、この小さな例でも、単純な操作のように見えるのに非常に長い時間がかかったことに驚いています。

マティアス・オサドニック

ブール配列と式を使用して、ループなしでnumpyのロジックを表現できます。

def get_motion_id(speed):
    mask = np.zeros(speed.size, dtype=bool)

    # mask[i] == True if Speed[i - 1] == 0 and Speed[i] > 0
    mask[1:] = speed[:-1] == 0
    mask &= speed > 0

    # Taking the cumsum increases the motion_id by one where mask is True
    motion_id = mask.astype(int).cumsum()
    # Carry over beginning of a motion to the preceding step with Speed == 0
    motion_id[:-1] = motion_id[1:]
    return motion_id


# small demo example
df = pd.DataFrame({'Speed': [3, 0, 1, 2, 0, 1]})
df['Motion_ID'] = get_motion_id(df['Speed'])
print(df)
   Speed  Motion_ID
0      3          0
1      0          1
2      1          1
3      2          1
4      0          2
5      1          2

10,000行の例では、約800のスピードアップが見られます。

%time df['Motion_ID'] = get_motion_id(df['Speed'])
CPU times: user 5.26 ms, sys: 3.18 ms, total: 8.43 ms
Wall time: 8.01 ms

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

データフレームの値を行と列のインデックスで置き換えるときにループを回避するにはどうすればよいですか?

分類Dev

パンダのデータフレームインデックスは、データフレームのサブセットにインデックスを付けるときに問題を引き起こします。インデックスを削除するにはどうすればよいですか、またはエラーの発生を防ぐにはどうすればよいですか?

分類Dev

Pandasデータフレームにインデックス付きの空の行を追加します

分類Dev

vhdlのforループでインデックスにアクセスすることは可能ですか?エラー:インデックス付きの名前プレフィックスタイプnatrualは配列タイプではありません

分類Dev

インデックスプレースホルダーの代わりに名前付き入力パラメーターを受け入れることができる「String.Format」はありますか?

分類Dev

Rのデータテーブル(DTパッケージ)のセルの背景を列と行の名前またはインデックスで色付けするにはどうすればよいですか?

分類Dev

パンダの時間インデックス付きデータフレームの将来の値をローリングするためにループします。これを高速化できますか?

分類Dev

日付が現在のインデックスと前のインデックスの間にある場合は、「datetime」インデックスを使用してデータフレームの現在の行に値を追加します

分類Dev

Rで2つのデータフレームを結合するときに、マージはランダムな行をスキップします

分類Dev

pandasデータフレームは特定のインデックスの前に行を取ります

分類Dev

データフレームとベクトルの行を照合するときに列インデックスをプルする方法

分類Dev

インデックス付きのパンダデータフレームの最初の行を取得します

分類Dev

インデックス付きのパンダデータフレームの最初の行を取得します

分類Dev

マルチインデックスデータフレームの最初の列の2番目の行に名前を付けるにはどうすればよいですか?今は空白です

分類Dev

番号順に名前を付けたデータを1行で選択することはできますか?

分類Dev

行インデックスのデータフレームからデータフレームにインデックスを付ける

分類Dev

Pythonでデータフレームの行ごとに値のインデックスを見つけ、次の列の値を抽出する方法

分類Dev

データフレームの列と同じ名前の名前付きリストを作成した場合、rにデータフレームの行を追加するにはどうすればよいですか?

分類Dev

パンダのpyplotにおける間違ったx値は整数にインデックスを変換してデータフレーム。どのように私は、正しい値を得ることができますか?

分類Dev

Rでは、グループ化されたデータフレームから名前付きリストをどのように作成しますか?

分類Dev

任意のファイルまたはUTIタイプを開くアプリケーションについて、起動サービスデータベースにクエリを実行することはできますか?

分類Dev

両方のデータフレームにまったく同じ列とインデックスがある場合、別のデータフレームの条件を照合して、あるデータフレームのデータをグループ化するにはどうすればよいですか?

分類Dev

他のデータフレームの行と列の情報に基づいてデータフレームにインデックスを付ける

分類Dev

ElasticSearchでドキュメント内のすべてのフィールドにインデックスを付けることはできますか?

分類Dev

マップ/フィルタリングされた無限リストにインデックスを付けると、インデックスの前のすべての要素にマップ/フィルター機能が適用されますか?

分類Dev

Python - ファイルの特定の行の値にインデックスを付けることはできますか?

分類Dev

Pythonデータフレームはトップ5のインデックスを見つけ、別の列にインデックスを付けます

分類Dev

どのように私はPythonのデータフレームのインデックスを組み合わせることができますか?

分類Dev

デザインタイムデータを有効にするために、属性の前に「d:」プレフィックスを使用することはできません

Related 関連記事

  1. 1

    データフレームの値を行と列のインデックスで置き換えるときにループを回避するにはどうすればよいですか?

  2. 2

    パンダのデータフレームインデックスは、データフレームのサブセットにインデックスを付けるときに問題を引き起こします。インデックスを削除するにはどうすればよいですか、またはエラーの発生を防ぐにはどうすればよいですか?

  3. 3

    Pandasデータフレームにインデックス付きの空の行を追加します

  4. 4

    vhdlのforループでインデックスにアクセスすることは可能ですか?エラー:インデックス付きの名前プレフィックスタイプnatrualは配列タイプではありません

  5. 5

    インデックスプレースホルダーの代わりに名前付き入力パラメーターを受け入れることができる「String.Format」はありますか?

  6. 6

    Rのデータテーブル(DTパッケージ)のセルの背景を列と行の名前またはインデックスで色付けするにはどうすればよいですか?

  7. 7

    パンダの時間インデックス付きデータフレームの将来の値をローリングするためにループします。これを高速化できますか?

  8. 8

    日付が現在のインデックスと前のインデックスの間にある場合は、「datetime」インデックスを使用してデータフレームの現在の行に値を追加します

  9. 9

    Rで2つのデータフレームを結合するときに、マージはランダムな行をスキップします

  10. 10

    pandasデータフレームは特定のインデックスの前に行を取ります

  11. 11

    データフレームとベクトルの行を照合するときに列インデックスをプルする方法

  12. 12

    インデックス付きのパンダデータフレームの最初の行を取得します

  13. 13

    インデックス付きのパンダデータフレームの最初の行を取得します

  14. 14

    マルチインデックスデータフレームの最初の列の2番目の行に名前を付けるにはどうすればよいですか?今は空白です

  15. 15

    番号順に名前を付けたデータを1行で選択することはできますか?

  16. 16

    行インデックスのデータフレームからデータフレームにインデックスを付ける

  17. 17

    Pythonでデータフレームの行ごとに値のインデックスを見つけ、次の列の値を抽出する方法

  18. 18

    データフレームの列と同じ名前の名前付きリストを作成した場合、rにデータフレームの行を追加するにはどうすればよいですか?

  19. 19

    パンダのpyplotにおける間違ったx値は整数にインデックスを変換してデータフレーム。どのように私は、正しい値を得ることができますか?

  20. 20

    Rでは、グループ化されたデータフレームから名前付きリストをどのように作成しますか?

  21. 21

    任意のファイルまたはUTIタイプを開くアプリケーションについて、起動サービスデータベースにクエリを実行することはできますか?

  22. 22

    両方のデータフレームにまったく同じ列とインデックスがある場合、別のデータフレームの条件を照合して、あるデータフレームのデータをグループ化するにはどうすればよいですか?

  23. 23

    他のデータフレームの行と列の情報に基づいてデータフレームにインデックスを付ける

  24. 24

    ElasticSearchでドキュメント内のすべてのフィールドにインデックスを付けることはできますか?

  25. 25

    マップ/フィルタリングされた無限リストにインデックスを付けると、インデックスの前のすべての要素にマップ/フィルター機能が適用されますか?

  26. 26

    Python - ファイルの特定の行の値にインデックスを付けることはできますか?

  27. 27

    Pythonデータフレームはトップ5のインデックスを見つけ、別の列にインデックスを付けます

  28. 28

    どのように私はPythonのデータフレームのインデックスを組み合わせることができますか?

  29. 29

    デザインタイムデータを有効にするために、属性の前に「d:」プレフィックスを使用することはできません

ホットタグ

アーカイブ