Pandas DataFrame Python:行の構築とフィルタリング
pd.DataFrame(data)を使ってPythonでpandas DataFrameを作成します。列と値には等しい長さのリストからなる辞書を使用します。レコードにラベル付きの行と列、列の選択、またはベクトル化フィルタリングが必要な場合にDataFrameを使用してください。ブールマスクはPythonのループを書かずに表形式データをフィルタリングします。明示的にリセットしない限り、結果は元のインデックスラベルを保持します。
Python Pandas DataFrameの行フィルタリングサンプル
出力:
ここに出力が表示されます...
出力:
product units
Keyboard 12
Monitor 15
このサンプルの動作説明
import pandas as pdはパッケージに慣例的なpdエイリアスを与えます。- pandas DataFrameコンストラクタは各辞書キーを列ラベルに変換します。両方のリストに3つの値が含まれるため、pandasは3行を作成し、
0、1、2を含むデフォルトのRangeIndexを割り当てます。 sales["units"] >= 10はそのインデックスに揃えたブールSeriesを生成します。マスクをsales[...]に戻すと、値がTrueの行のみが保持されます。to_string(index=False)は出力テーブルにインデックスを表示しません。保存されたラベルを削除したり番号を振り直したりはしません。
DataFrameの実行で実際に何が起きたかを確認する
同じページでプログラムを2回実行し、それぞれ完了後にRun Detailsを開きます。これにより、パネルがDataFrameのベンチマークとしてコールドランの時間を誤解するのではなく、依存関係の実験になります。
| 観察 | コールドランタイム | 同じページのウォームランタイム |
|---|---|---|
| Requests | 0 | 0 |
| 新たに利用可能なパッケージ | pandas 1.5.3, numpy 1.26.1, python-dateutil 2.8.2, six 1.16.0, pytz 2023.3 | 0 |
| 変化したこと | pandasとその依存関係が利用可能になった | ランタイムはすでに持っていた |
web.runはimport pandasを検出し、ユーザーのPythonが開始する前にサポートされているパッケージを読み込みます。Run Detailsはその実行の前後で利用可能なパッケージの差分を報告するため、ウォームランのPackagesリストが空の場合は「新たに読み込まれたものはない」という意味であり、「pandasが使われなかった」ではありません。
最初の実行の合計時間にはパッケージのブートストラップとPython実行が含まれます。pd.DataFrame(...)を責める前にウォームランと比較してください。時間はマシンやキャッシュの状態によって異なるため、Packagesリストを使ってブートストラップ作業を特定してください。
辞書とフィルタリングはローカルに留まるため、どちらの実行もユーザーリクエストはゼロです。コールドランは依然としてランタイム活動としてパッケージファイルをダウンロードします。したがって「ユーザーリクエストなし」はスニペットが外部リクエストを行わなかったことを証明し、ブラウザがゼロバイトを転送したことを意味するわけではありません。
フィルタリング後のインデックスの罠:locはilocではない
フィルタリングはラベルを保持します。ここではready.index.tolist()は[0, 2]ですが、index=Falseにより出力は新しい2行テーブルのように見えます。2番目の表示行をラベル1として扱うコードは失敗します:
誤り:
second_product = ready.loc[1, "product"] # KeyError: 1
位置で2番目の行を取得する正しい方法:
second_product = ready.iloc[1]["product"]
後続コードが連続したラベルを必要とする場合の正しい方法:
ready = ready.reset_index(drop=True)
second_product = ready.loc[1, "product"]
インデックスラベルには.locを、ゼロベースの位置には.ilocを使用します。インデックスをリセットするのは、新しいラベルが意図した結果の一部である場合のみにしてください。そうでなければ、ソースラベルを保持することでフィルタリングされた行を元のデータに追跡できます。
DataFrameコンストラクタの長さエラー
リストの辞書は長方形のテーブルを記述する必要があります。pandasは短い列の埋め方を推測する代わりにValueError: All arrays must be of the same lengthを発生させます。
誤り:
pd.DataFrame({"product": ["Keyboard", "Mouse"], "units": [12]})
正しい:
pd.DataFrame({"product": ["Keyboard", "Mouse"], "units": [12, None]})
明示的な欠損値を追加するのは、それがデータを正直に表している場合のみにしてください。そうでなければ、テーブルを構築する前にソースレコードを修正してください。
DataFrameが適切なコンテナである場合
| 選択 | 適した場合 |
|---|---|
| DataFrame | 複数のラベル付き列にブールインデックス、列操作、または表形式分析が必要 |
| Series | 1つのラベル付き次元で十分 |
| 辞書のリスト | 小さなレコードコレクションに反復処理が必要だが列操作は不要 |
| NumPy配列 | 均質な数値データに行または列ラベルなしの行列演算が必要 |
DataFrameは、ラベルとベクトル化操作が実際の変換を簡素化するときにパッケージとメモリのオーバーヘッドを正当化します。レコードが小さく通常のPython反復処理だけが必要な場合は辞書のリストを使用してください。