pandasの小技(1)

実際問題のデータはいらない項目がたくさん入っていることがほとんどだ.これをそのままpandasで読み込んで,itertuplesなどで処理をすると,とても遅い.時には,大量のメモリをくって止まってしまうこともある.以下のようなテクニックでこれを避けることができる.

まずは,普通に企業からいただいたデータ(需要データ)を読み込んでみる.

import pandas as pd
df = pd.read_csv("demand.csv")
df.info(memory_usage='deep')

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 772369 entries, 0 to 772368
Data columns (total 13 columns):
Unnamed: 0    772369 non-null int64
中略
dtypes: int64(9), object(4)
memory usage: 349.9 MB

今度は,必要な列だけを選択して読み込んでみる.

df = pd.read_csv("demand.csv", usecols=["日付", "Customer Name", "Product Name", "Number of Items Ordered"] ) 
df.info(memory_usage='deep')

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 772369 entries, 0 to 772368
Data columns (total 4 columns):
中略
日付        772369 non-null object
dtypes: int64(1), object(3)
memory usage: 221.0 MB

ちょっと減った.今度は,顧客名と製品名をカテゴリーデータと指定して読んでみる.

df = pd.read_csv("demand.csv", usecols=["日付", "Customer Name", "Product Name", "Number of Items Ordered"], dtype={"Customer Name":"category", Product Name:"category"})
df.info(memory_usage='deep')

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 772369 entries, 0 to 772368
Data columns (total 4 columns):
中略
日付        772369 non-null object
dtypes: category(2), int64(1), object(1)
memory usage: 58.5 MB

大分減った.

ついでに日付をdatetime型に変換して,インデックス指定しておく.

df = pd.read_csv("demand.csv", parse_dates=["日付"],index_col="日付",
usecols=["日付", "Customer Name", "Product Name", "Number of Items Ordered"], dtype={"Customer Name":"category", Product Name:"category"})
df.info(memory_usage='deep')

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 772369 entries, 2015-01-05 to 2018-12-29
Data columns (total 3 columns):
中略
dtypes: category(2), int64(1)
memory usage: 15.0 MB

もっと減った.最初と比べると7%くらいのメモリ使用量になっている.これをpickleかto_csvで保存しておけば良い.



この記事が気に入ったらサポートをしてみませんか?