マイケル・マコーレー

機械学習の旅のためのパンダの機能を知っている必要があります

ソースノード: 1865356

この記事は、の一部として公開されました データサイエンスブログソン

概要

まあ、できる可能性は十分にあります!

Python を主要なプログラミング言語として使用するデータ サイエンティストにとって、Pandas パッケージは必須のデータ分析ツールです。 Pandas パッケージには、データ サイエンティストが必要とするすべてのものが含まれており、すべてのコースで最初にその使用方法を教えてくれました。 非常に大きく、強力で、想像できるほとんどすべての表操作を実行します。 ただし、この幅は場合によっては不利になる可能性があります。

まれなエッジケース、さまざまなシナリオを解決する多くの美しい機能があります.

pandas の主な欠点の XNUMX つは、pandas がデータ構造を RAM に保存するため、大規模なデータセットに苦労することです。これは、データ サイズが大きくなるにつれて不十分になる可能性があります。 これには PySpark または Dask を使用します。

Pandas パッケージは広く使用されていますが、あまり使用されていないか、その存在に気付いていないために、見過ごされがちな機能がまだたくさんあります。 この投稿では、これらの機能を再紹介し、Pandas が以前に認識していたよりもはるかに優れていることを示します。

Pipe

パンダで簡潔かつコンパクトな方法でデータクリーニングを実行するには、パイプ関数を使用できます。これにより、XNUMX つの操作で複数の関数を組み合わせることができます。

たとえば、引数を受け入れる drop_duplicates、encode_categoricals、remove_outliers などの関数を適用したい場合。

df_cleaned = (diamonds.pipe(drop_duplicates). pipe(remove_outliers, ['price', 'carat', 'depth']). pipe(encode_categoricals, ['cut', 'color', 'clarity']) )

因数分解する

この関数は、Sklearns Label Encoder の代替です。

# 末尾の [0] に注意 diamonds["cut_enc"] = pd.factorize(diamonds["cut"])[0] >>> diamonds["cut_enc"].sample(5) 52103 2 39813 0 31843 0 10675 0 6634 0 名前: cut_enc、dtype: int64

因数分解すると、値のタプル (エンコードされた値と一意のカテゴリのリスト) が得られます。

値、一意 = pd.factorize(diamonds["cut"]、sort=True) >>> 値[:10] 配列([0, 1, 3, 1, 3, 2, 2, 2, 4, 2] , dtype=int64) >>> ユニーク ['理想', 'プレミアム', 'とても良い', '良い', '普通']

爆発する

爆発 | パンダ関数

による写真 エデワー・フォスター on Unsplash

Explode は興味深い名前の関数です。 例から始めて、次に説明しましょう。

df = pd.Series([1, 6, 7, [46, 56, 49], 45, [15, 10, 12]]).to_frame("汚い") >>> df
データ | パンダ関数
著者による画像

機能列には、リストで示される XNUMX つの行があります。 このタイプのデータは、いくつかの質問が複数の選択肢を受け入れる調査で利用できます。

>>> df.explode("汚い", ignore_index=True)
データ爆発
著者による画像

この関数は、値の配列を持つセルを取り、複数の行に展開します。 数値インデックスの順序を維持するには、ignore_index を True として使用します。

の間に

範囲内の数値機能をブール値でインデックス化するには、次の便利な関数を使用します。

# 価格が 3500 ~ 3700 ドルのダイヤモンドを取得する diamonds[diamonds["price"].between(3500, 3700, inclusive="neither")].sample(5)
データ間 | パンダ関数
著者による画像

 

T

DataFrame には、転置と呼ばれる単純な T 属性があります。 あまり使用しないかもしれませんが、describe メソッドはデータフレームを表示する際に役立ちます。

>>> boston.describe().T.head(10)
転置
著者による画像

 

パンダのオプション

デフォルトの動作を調整および変更するのに役立つ pandas のグローバル設定を使用できます。

>>> dir(pd.options) ['compute', 'display', 'io', 'mode', 'plotting']

5つのモジュールで構成されています。 ディスプレイの下で利用可能なオプションを見てみましょう。 利用可能なオプションはたくさんありますが、私は主に max_columns を使用します。

>>> dir(pd.options.display) ['chop_threshold', 'max_columns', 'max_colwidth', 'max_info_columns', 'max_info_rows', 'max_rows', ... 'precision', 'show_dimensions', 'unicode' 、 '幅']

ほとんどの人は max_columns と precision を使用します

# 列数表示の制限をなくす pd.options.display.max_columns = None # 小数点以下 5 桁のみ表示 pd.options.display.precision = 5 # 科学表記法を取り除く

Convert_dtypes

パンダには、一部の列をオブジェクト データ型としてマークする厄介な習慣があることは誰もが知っています。 それらの型を直接定義するのではなく、最適なデータ型を推測しようとする convert dtypes メソッドを使用できます。

sample = pd.read_csv("data/station_day.csv",usecols=["StationId", "CO", "O3", "AQI_Bucket"]) >>> sample.dtypes StationId オブジェクト CO float64 O3 float64 AQI_Bucket オブジェクト dtype:オブジェクト >>> sample.convert_dtypes().dtypes StationId 文字列 CO float64 O3 float64 AQI_Bucket 文字列 dtype: オブジェクト

Select_dtypes

名前から、その機能が何をするのかは明らかだと思います。 include オプションと exclude オプションを使用して、特定のデータ型を含めるか除外する列を指定できます。

np.number を持つ数値列のみを選択します。次に例を示します。

# 数値列のみを選択 diamonds.select_dtypes(include=np.number).head()
dtypeを選択
著者による画像

 

マスク

この関数は、カスタム条件が満たされていない値を置き換えるのに役立ちます。

# サンプルデータ作成 age = pd.Series([55, 52, 50, 66, 57, 59, 49, 60]).to_frame("ages") age
マスク | データ
著者による画像

上記の操作を行った後。

マスキング実施
著者による画像

最小値と最大値

最小値と最大値はよく知られていますが、一部のエッジ ケースではより優れたプロパティがいくつかあります。

index = ["Diamonds", "Titanic", "Iris", "Heart Disease", "Loan Default"] libraries = ["XGBoost", "CatBoost", "LightGBM", "Sklearn GB"] df = pd.DataFrame ( {lib: np.random.uniform(90, 100, 5) for libs in libraries}, index=index ) >>> df
最小値と最大値
著者による画像 

上記の架空の DataFrame は、XNUMX つのデータセットに対する XNUMX つの異なる勾配ブースティング ライブラリの結果を示しています。 各データセットで最善を尽くしたパッケージを探しています。 max で洗練された方法でそれを達成する方法は次のとおりです。

>>> df.max(axis=1) Diamonds 99.52684 Titanic 99.63650 Iris 99.10989 Heart Disease 99.31627 Loan Default 97.96728 dtype: float64

Nlargest と Nsmallest

nlargest と nsmallest は、変数の上位 N 個または ~(上位 N 個) の値を表示するのに役立ちます。

diamonds.nlargest(5, "価格")
最大と最小
著者による画像
diamonds.nsmallest(5, "価格")
最小
著者による画像

 

Idxmax と Idxmin

列で max または min を呼び出すと、パンダは最大/最小の数値を返します。 ただし、これらの関数が提供しない最小/最大の位置が必要な場合があります。

代わりに、idxmax/idxmin を使用できます。

>>> ダイヤモンド.price.idxmax() 27749 >>> ダイヤモンド.carat.idxmin() 14

値の数

欠損値のパーセンテージを見つける一般的な方法は、isnull と sum を組み合わせて、配列のサイズで割ることです。

しかし、関連する引数を持つ value_counts は同じことを行います:

ハウジング = pd.read_csv("train.csv") >>> ハウジング["FireplaceQu"].value_counts(dropna=False, normalize=True) NaN 0.47260 Gd 0.26027 TA 0.21438 Fa 0.02260 Ex 0.01644 Po 0.01370 名前: FireplaceQu、dtype: float64

クリップ

クリップ機能は、範囲外の外れ値を見つけて、それらをハード リミットに置き換えるのに役立ちます。

>>> age.clip(50, 60)
クリップ用データ
著者による画像

 

At_time および Between_time

これらの関数は、粒度の高い時系列を操作する際に役立ちます。

at_time は、特定の日付または時刻の値を取得するのに役立ちます。

index = pd.date_range("2021-08-01", period=100, freq="H") df = pd.DataFrame({"col": list(range(100))}, index=index) >> > df.head()
at_time の例 | パンダ関数
著者による画像

>>> df.at_time(“15:00”)

.at_time | パンダ関数
著者による画像

カスタム範囲内の行をフェッチするために使用される between_time。

from datetime import datetime >>> df. between_time("09:45", "12:00")
between_time
著者による画像

 

Bdate_range

この機能は、営業日の頻度で時系列インデックスを作成するのに役立ちます。 金融の世界には、このタイプの周波数があります。 そのため、reindex 関数で時系列を再インデックスする際に、この機能が役立つかもしれません。

series = pd.bdate_range("2021-01-01", "2021-01-31") # 21ヶ月間 >>> len(series) XNUMX

アットとイアット

これら XNUMX つのアクセサは、loc および iloc よりも大幅に高速です。 ただし、欠点があります。 一度に XNUMX つの値のみを選択または置換できます。

# [index, label] >>> diamonds.at[234, "cut"] 'Ideal' # [index, index] >>> diamonds.iat[1564, 4] 61.2 # price列の16541行目を置換 >> > diamonds.at[16541, "価格"] = 10000

アルグソート

この関数は、フィーチャの配列をソートするインデックスを抽出するのに役立ちます。

tips.reset_index(inplace=True, drop=True) sort_idx = tips["total_bill"].argsort(kind="mergesort") # ここで、total_bill に基づいて `tips` をソートします tips.iloc[sort_idx].head()
arg_sort
著者による画像

 

猫アクセサー

pandas では、str や dt などのアクセサーを使用して、日付と文字列に対して Python の組み込み関数を使用できます。

>>> diamonds.dtypes カラット float64 カット カテゴリ カラー カテゴリ クラリティ カテゴリ デプス float64 テーブル float64 価格 int64 x float64 y float64 z float64 cut_enc int64 dtype: オブジェクト

カテゴリ列で cat アクセサーを使用して、多くの特別な関数を使用できます。 一意のカテゴリを見つけるためのカテゴリ、フィーチャの名前を変更するための rename_categories などの関数があります。

diamonds["new_cuts"] = diamonds["cut"].cat.rename_categories(list("ABCDE")) >>> diamonds["new_cuts"].cat.categories Index(['A', 'B', ' C', 'D', 'E'], dtype='オブジェクト')

以下の関数の詳細リストについては、これをチェックしてください 猫アクセサー.

絞る

Squeeze は、まれではあるが悪化するエッジ環境で使用される機能です。

DataFrame をサブセット化するために使用される条件から単一の値が返される場合、これはこれらのケースの XNUMX つです。 次のシナリオを検討してください。

サブセット = diamonds.loc[diamonds.index >> サブセット
ブランド

セルが XNUMX つしかない場合でも、DataFrame を返します。 価格を取得するには、列名とインデックスの両方で .loc を使用する必要があるため、不便です。

絞り方がわかれば必要ありません。 この関数を使用して、単一セルの DataFrame または Series から軸を削除できます。 次のシナリオを検討してください。

>>> サブセット.スクイーズ() 326

削除する軸を指定できます。 今はスカラーのみが返されました。

>>> subset.squeeze("columns") # または "rows" 0 326 名前: 価格、dtype: int64

この関数は、単一の値を持つ Series または DataFrame でのみ機能することに注意してください。

エクセルライター

これは、Excel ファイルを作成し、その中に DataFrame を書き込むためのジェネリック クラスです。 これらXNUMXつのデータセットがあると考えてください。

# XNUMX つのデータセットを読み込む diamonds = sns.load_dataset("diamonds") tips = sns.load_dataset("tips") # pd.ExcelWriter("data/data.xlsx") をライターとして同じ Excel ファイルに書き込む: diamonds.to_excel (writer, sheet_name="diamonds") tips.to_excel(writer, sheet_name="tips")

新しいファイルが必要か、既存のファイルを変更するか、シートが存在する場合はどうなるか、使用する DateTime 形式を指定するプロパティがあります。 これをチェックして ドキュメント のガイドをご参照ください。

まとめ

パンダの完全な概要ではありません。 ドキュメント コードと機能に関する詳細情報が含まれています。 ここで提供されているコード スニペットのさまざまなバリエーションとさまざまなパラメーターを試してみることをお勧めします。 そうすることで、パンダの力を十分に理解することができます。

Dask や datatable などのライブラリは、大規模なデータセットを処理するための派手な新機能を備えた Pandas に徐々に取って代わりつつあります。Pandas は、Python データ サイエンス コミュニティで最も広く使用されているデータ操作ツールであり続けています。 現在の SciPy スタックにうまく適合するため、このライブラリは他のパッケージが従い構築するためのパラダイムとして機能します。

この投稿が洞察に満ちていることを願っています。読んでくれてありがとう。

この記事に示されているメディアは、Analytics Vidhyaが所有しておらず、作成者の裁量で使用されています。

出典: https://www.analyticsvidhya.com/blog/2021/08/must-know-pandas-functions-for-machine-learning-journey/

タイムスタンプ:

より多くの 分析Vidhya