巨大なパンダデータフレームで行をスライスする最速の方法を探しています

Z.Wei

私のプログラムは、巨大なパンダデータフレームから列の値に基づいて行をフェッチする必要があります。応答時間は重要です。私はそれを行うために最も一般的な方法を使用します、例えば:

df.loc[df['id'] == 500000, :]

パーtimeit私のMac上のそれは100万行のデータフレーム上で上記の操作を完了するために4ミリ秒を要しました。しかし、私の目標は、時間を0.4ミリ秒に短縮することです。私はかつてこのデータフレームをセットに変換することを検討しましたが、セットは順序付けられておらず、インデックス作成やスライスをネイティブにサポートしていません。助言がありますか?

CJR

これを設定しましょう:

import pandas as pd
import numpy as np
df = pd.DataFrame({"id": np.random.randint(100,size=(1000000,))})

次に、いくつかのオプションのベンチマークを行いましょう。現在のブール値+ .loc

>>> timeit.timeit("df.loc[df['id'] == 50, :]", setup = "from __main__ import df", number=1000)
2.566220869999597

クエリエンジン:

>>> timeit.timeit("df.query('id == 50')", setup = "from __main__ import df", number=1000)
14.591400260000228

インデックスを個別のルックアップとして使用する:

>>> idx = pd.Index(df['id'])
>>> timeit.timeit("df.loc[idx == 50, :]", setup = "from __main__ import df, idx", number=1000)
2.2155187300013495

ルックアップにデータフレームインデックスを使用する:

>>> df.index = df["id"]
>>> timeit.timeit("df.loc[50, :]", setup = "from __main__ import df", number=1000)
2.625610274999417

そして.isin()、コメントの誰かが持っていたその考え:

>>> timeit.timeit("df.loc[df['id'].isin([50]), :]", setup = "from __main__ import df", number=1000)
9.542700138999862

クエリエンジンが(予想どおり)単純な同等性のために遅いことを除いて、あなたが持っているルックアップ時間よりもはるかに良くなることはないように見えます。

df_unique = pd.DataFrame({'id': range(1000000)})

一意のIDがどのように役立つかを見てみましょう。

>>> timeit.timeit("df_unique.loc[df_unique['id'] == 50, :]", setup = "from __main__ import df_unique", number=1000)
1.9672015519990964

それから口述に:

>>> df_unique.index = df_unique['id']
>>> df_dict = df_unique.to_dict(orient='index')
>>> timeit.timeit("df_dict[50]", setup = "from __main__ import df_dict", number=1000)
6.247700002859347e-05

まあ、これは明らかに勝者のようです。

>>> timeit.timeit("pd.Series(df_dict[50])", setup = "from __main__ import df_dict, pd", number=1000)
0.2747819870000967

何かのためにシリーズにキャストバックする必要がある場合でも、これは以前よりも桁違いに高速です。(必要に応じて、シリーズをdictに非常に簡単にマップし直し、オーバーヘッドなしでdictルックアップの速度を維持することもできます)

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

パンダのデータフレーム検索を高速化する方法を探しています

分類Dev

パンダデータフレームで欠落している行の数をユーザーインデックスでカウントします

分類Dev

別のデータフレームから null ではない行を選択し、そのインデックスをランダムに取得する方法

分類Dev

メモリに収まらない可能性のある巨大なパンダデータフレームからインデックスを削除する

分類Dev

データベースなしでクラスを作成するためのデザインパターンを探しています

分類Dev

パンダのデータフレームを反復処理するためのより高速な方法を探しています

分類Dev

パンダ-2つのデータフレームを比較して、値が最初のデータフレームの倍数である1日あたりの最初のインスタンスを探します

分類Dev

区切り文字なしでパンダのデータフレームをスライスします

分類Dev

日時列に基づいてパンダのデータフレームをスライスします

分類Dev

パンダの列(ilocでスライス)をメインデータフレームとして並べ替える方法はありますか?

分類Dev

パンダのデータフレームスライスは異なる結果を生成します

分類Dev

特定のテストでグルーヴィーなパフォーマンスを改善する方法に関するアイデアを探しています

分類Dev

同じインデックスと列を持つ2つのパンダデータフレームから計算を実行する最速の方法

分類Dev

列名と行インデックスを使用してパンダデータフレームから値を選択する正しい方法は何ですか?

分類Dev

パンダのデータフレームをスライスして、連続していない列を取得します

分類Dev

さまざまなインターフェイス実装でクラスのさまざまなインスタンスを作成できるデザインパターンを探しています

分類Dev

Parallel Insertステートメントを使用してMySQLテーブルに巨大なパンダデータフレームを挿入する方法は?

分類Dev

パンダデータフレームの行のインデックスを整数として取得します

分類Dev

巨大なパンダデータフレームの複数の行にエントリを再配布します

分類Dev

他の列の望ましい部分にインデックスを付けて、パンダデータフレームに新しい列を作成する方法

分類Dev

インデックスのリストを指定してデータフレームに複数の行を挿入する最速の方法(Python)

分類Dev

Python:パンダのデータフレームを変換して、インデックスと列のIDが行の要素になるようにします

分類Dev

インデックスで2つのパンダデータフレームをマージするが、欠落している値を埋める方法

分類Dev

2つのパンダデータフレームから行をスライスして、他の値とマージする方法

分類Dev

1行のパンダデータフレームをスライスすると、スライスはシリーズになります

分類Dev

パンダ: 大きなデータフレームを検索する最速の方法は何ですか

分類Dev

巨大なファイルからパンダのデータフレームの作成をスピードアップする方法は?

分類Dev

行に応じて異なるインデックス列を持つパンダデータフレームの値を抽出します

分類Dev

2つの文字列を使用してパンダのデータフレームをスライスする

Related 関連記事

  1. 1

    パンダのデータフレーム検索を高速化する方法を探しています

  2. 2

    パンダデータフレームで欠落している行の数をユーザーインデックスでカウントします

  3. 3

    別のデータフレームから null ではない行を選択し、そのインデックスをランダムに取得する方法

  4. 4

    メモリに収まらない可能性のある巨大なパンダデータフレームからインデックスを削除する

  5. 5

    データベースなしでクラスを作成するためのデザインパターンを探しています

  6. 6

    パンダのデータフレームを反復処理するためのより高速な方法を探しています

  7. 7

    パンダ-2つのデータフレームを比較して、値が最初のデータフレームの倍数である1日あたりの最初のインスタンスを探します

  8. 8

    区切り文字なしでパンダのデータフレームをスライスします

  9. 9

    日時列に基づいてパンダのデータフレームをスライスします

  10. 10

    パンダの列(ilocでスライス)をメインデータフレームとして並べ替える方法はありますか?

  11. 11

    パンダのデータフレームスライスは異なる結果を生成します

  12. 12

    特定のテストでグルーヴィーなパフォーマンスを改善する方法に関するアイデアを探しています

  13. 13

    同じインデックスと列を持つ2つのパンダデータフレームから計算を実行する最速の方法

  14. 14

    列名と行インデックスを使用してパンダデータフレームから値を選択する正しい方法は何ですか?

  15. 15

    パンダのデータフレームをスライスして、連続していない列を取得します

  16. 16

    さまざまなインターフェイス実装でクラスのさまざまなインスタンスを作成できるデザインパターンを探しています

  17. 17

    Parallel Insertステートメントを使用してMySQLテーブルに巨大なパンダデータフレームを挿入する方法は?

  18. 18

    パンダデータフレームの行のインデックスを整数として取得します

  19. 19

    巨大なパンダデータフレームの複数の行にエントリを再配布します

  20. 20

    他の列の望ましい部分にインデックスを付けて、パンダデータフレームに新しい列を作成する方法

  21. 21

    インデックスのリストを指定してデータフレームに複数の行を挿入する最速の方法(Python)

  22. 22

    Python:パンダのデータフレームを変換して、インデックスと列のIDが行の要素になるようにします

  23. 23

    インデックスで2つのパンダデータフレームをマージするが、欠落している値を埋める方法

  24. 24

    2つのパンダデータフレームから行をスライスして、他の値とマージする方法

  25. 25

    1行のパンダデータフレームをスライスすると、スライスはシリーズになります

  26. 26

    パンダ: 大きなデータフレームを検索する最速の方法は何ですか

  27. 27

    巨大なファイルからパンダのデータフレームの作成をスピードアップする方法は?

  28. 28

    行に応じて異なるインデックス列を持つパンダデータフレームの値を抽出します

  29. 29

    2つの文字列を使用してパンダのデータフレームをスライスする

ホットタグ

アーカイブ