MyEnigma

とある自律移動システムエンジニアのブログです。#Robotics #Programing #C++ #Python #MATLAB #Vim #Mathematics #Book #Movie #Traveling #Mac #iPhone

Pandas逆引きクックブック


pandasクックブック

目次

はじめに

大量のデータを処理する時にPythonのPandasは

非常に便利なライブラリですが、

myenigma.hatenablog.com

久しぶりにPandasを使うと、

このようなことをしたい時にどうすればいいんだっけと

毎回調べることになるので、自分がよく調べ直す事柄をメモしておきます。

 

DataFrameのメモリサイズや、各列の型などを確認する。

df.info()関数を使うと、簡単に確認できます。

In [30]: df = pd.DataFrame(
    ...:     index = ["Alice", "Bob", "Charlie", "Dave", "Ellen", "Frank"],
    ...:     data={'age': [24, 42, 18, 68, 24, 30],
    ...:           'state': ["NY", "CA", "CA", "TX", "CA", "NY"],
    ...:           'point': [64, 92, 70, 70, 88, 57]
    ...:           }
    ...: )

In [31]: df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 6 entries, Alice to Frank
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   age     6 non-null      int64
 1   state   6 non-null      object
 2   point   6 non-null      int64
dtypes: int64(2), object(1)
memory usage: 192.0+ bytes

DataFrameの一部をカテゴリデータに変換する

as.type("category")でカテゴリデータに変換できます。

In [30]: df = pd.DataFrame(
    ...:     index = ["Alice", "Bob", "Charlie", "Dave", "Ellen", "Frank"],
    ...:     data={'age': [24, 42, 18, 68, 24, 30],
    ...:           'state': ["NY", "CA", "CA", "TX", "CA", "NY"],
    ...:           'point': [64, 92, 70, 70, 88, 57]
    ...:           }
    ...: )

In [31]: df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 6 entries, Alice to Frank
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   age     6 non-null      int64
 1   state   6 non-null      object
 2   point   6 non-null      int64
dtypes: int64(2), object(1)
memory usage: 192.0+ bytes

In [32]: df["state"]=df["state"].astype("category")

In [33]: df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 6 entries, Alice to Frank
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   age     6 non-null      int64
 1   state   6 non-null      category
 2   point   6 non-null      int64
dtypes: category(1), int64(2)
memory usage: 282.0+ bytes

今回の例の場合は、データ数が小さいため、

全体のメモリ消費量が減っていませんが、

データが大きい時には、

メモリの消費量や検索スピードが高速化します。

pandas.pydata.org

 

また、read_csvで読み込んだデータをカテゴリデータ化するよりも、

read_csv関数のdtype引数でカテゴリデータ指定したほうがメモリ消費量が少なくすみます。

df = pd.read_csv("data.csv", dtype={"state":"category"})

 

複数の条件式を使って、DataFrameの一部を抽出する

複数の条件を使って、DataFrameの一部を抽出したいときは、

下記のように、それぞれの条件のboolean seriesを作って、

それぞれを&, |で条件をつなげると複数条件の検索結果を抽出できます。

各条件をちゃんと()つけなかったり、and, orではエラーが出ることに注意が必要です。

In [6]: import pandas as pd

In [7]: df = pd.DataFrame(
   ...:     index = ["Alice", "Bob", "Charlie", "Dave", "Ellen", "Frank"],
   ...:     data={'age': [24, 42, 18, 68, 24, 30],
   ...:           'state': ["NY", "CA", "CA", "TX", "CA", "NY"],
   ...:           'point': [64, 92, 70, 70, 88, 57]}
   ...: )

In [8]: df[(df["age"]>=20) & (df["state"]=="CA")]
Out[8]:
       age state point
Bob     42    CA    92
Ellen   24    CA    88

 

MultiIndexで特定のレベルのindexを取得する

get_level_values()関数を使うと特定のレベルの値を取得できます。

pandas.pydata.org

qiita.com

 

Pandasのapplyを高速化する

DataFrameの複数の列のデータから、新しい列を計算したい場合は、

applyを使うのが普通ですが、下記のツイートのようにnp.vectorizeを使うほうが、

高速で、読みやすいコードになると思います。

In [23]: import pandas as pd

In [24]: import numpy as np

In [25]: df = pd.DataFrame(
    ...:     index = ["Alice", "Bob", "Charlie", "Dave", "Ellen", "Frank"],
    ...:     data={'age': [24, 42, 18, 68, 24, 30],
    ...:           'state': ["NY", "CA", "CA", "TX", "CA", "NY"],
    ...:           'point': [64, 92, 70, 70, 88, 57]
    ...:           }
    ...: )

In [26]: df["ageXpoint"] = np.vectorize(lambda age, point: age*point)(
    ...:     df["age"], df["point"])

In [27]: df
Out[27]:
         age state  point  ageXpoint
Alice     24    NY     64       1536
Bob       42    CA     92       3864
Charlie   18    CA     70       1260
Dave      68    TX     70       4760
Ellen     24    CA     88       2112
Frank     30    NY     57       1710

applyにプログレスバーをつけたい。

参考資料

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

myenigma.hatenablog.com

MyEnigma Supporters

もしこの記事が参考になり、

ブログをサポートしたいと思われた方は、

こちらからよろしくお願いします。

myenigma.hatenablog.com