pandas便利だけどデフォルトパラメータでファイルを読み込むな!

Hiro H.
Hiro H.Researcher at Nagoya, Aichi
pandas便利だけど
デフォルトパラメータで
ファイルを読み込むな!
Python東海 #44 (2023.11.18)
H.Hiro [X (Twitter): @h_hiro_]
自己紹介
◦ H.Hiro (Twitter: @h_hiro_)
◦ Python東海の初参加は第29回(2016.2.6)
◦ 比較的不定期参加感
◦ 本業:アルゴリズム作ったりデータ分析したりしてる某
研究員
◦ ちょっとした処理はPythonで書くことが多いが、パ
フォーマンスまで考えたプログラムを書きたいときは
C++とかを使うことも
pandas
表形式のデータを扱うライブラリ
https://pandas.pydata.org/
行名と列名を入れた表のファイルを読み込み、
それを用いてアクセスしたりできる
Name Age Birthplace
Alice 20 Aichi
Bob 30 Gifu
Charles 40 Mie
import pandas as pd
data = pd.read_csv("info.csv", header=0, index_col=0)
print(data.at["Alice", "Birthplace"]) # "Aichi" を表示
pandasの(私の感じる)利点
◦ ファイルから行名や列名を取得しアクセスできる
◦ 列名だけなら、標準ライブラリの csv.DictReader で
もできるが、行名だと少々面倒
◦ 数値や文字列が混ざっていても自動で変換してくれる
◦ 先述の例だと、Ageは整数型、Birthplaceは文字列
型と扱ってくれる
Name Age Birthplace
Alice 20 Aichi
Bob 30 Gifu
Charles 40 Mie
import pandas as pd
data = pd.read_csv("info.csv", header=0, index_col=0)
print(type(data.at["Bob", "Age"])) # numpy.int64
print(type(data.at["Charles", "Birthplace"])) # str
pandasの注意点
◦ 前述の「よきにはからってくれる」点は利点でもあるの
だが、しばしば欠点にもなる
◦ すなわち、意図しない変換がなされてしまう
◦ 特に、ファイルを読み込む際の引数で、「これはデフォ
ルトパラメータにするな!」と私が思うものが結構ある
ので紹介します
pandas
◦ ファイルを読み込む関数として、pandas.read_csv を
想定して説明します
◦ read_excelというのもあり、使い方は殆ど同じです
◦ で引数を見るとこんな感じ(めちゃくちゃ多い)
https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html
デフォルト値のまま使うのに
注意が必要な引数
◦ header
◦ index_col
◦ na_values / keep_default_na
素性のわからないデータを読み込むときは、追加でこれ
も推奨
◦ dtype
header
◦ ヘッダー(列の名前)
◦ デフォルト:
◦ names引数で列名を別途
与えた場合は、ファイルからは
取得しない
◦ そうでない場合は、ファイルの0行目を利用する
◦ ヘッダーがあるとわかっているファイルを読み込むとき
はよいのだが、ファイルのその点を確認してから使うべ
きということで、自分は必ず0(0行目を利用)かNone
(ファイルからは読み込まない)を指定している
Name Age Birthplace
Alice 20 Aichi
Bob 30 Gifu
Charles 40 Mie
index_col
◦ インデックス(行の名前)
◦ デフォルト:原則は0列目。ただし
「0行目の列数<1行目の列数」
なら、0行目の最初のセルは
無視される(理由は後述)
◦ これもheaderと同様、「最初の列がインデックスである
か」を確認して使いたいため、自分は必ず0(0列目を
利用)かFalse(ファイルからは読み込まない)を指定し
ている
◦ index_colについては、ファイルから読み込まない場
合はFalseであることに注意
Name Age Birthplace
Alice 20 Aichi
Bob 30 Gifu
Charles 40 Mie
index_col(続き)
◦ この挙動の意味は、「0行目の
ヘッダーが、左上のセルを省略
している場合がある」ということ
を考慮している
◦ この場合、index_col=Falseを
指定しておけば、このように読
み込むが警告を出してくれる
デフォルト:原則は0列目。ただし「0行目の列数<1行目
の列数」なら、0行目の最初のセルは無視される
CSVファイル
Age,Birthplace
Alice,20,Aichi
Bob,30,Gifu
Charles,40,Mie
Age Birthplace
Alice 20 Aichi
Bob 30 Gifu
Charles 40 Mie
na_values /
keep_default_na
◦ 無効値(Python上では「nan」)と扱われる文字列を
指定
◦ デフォルトで何が該当するかはドキュメントに
https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html
◦ ある列の他の内容が普通の文字列であったとしても、
その中に空欄や「NA」という文字列があるとnan扱う
になってしまう…
◦ nanがないとわかっているデータなら、
keep_default_na=Falseを指定しておき、無効値が出
ないようにするのが安全
dtype
◦ 表全体で or 列ごとに何の型と
して読み込むか強制する
◦ 例えば右の表の例で
data = pd.read_csv("info.csv",
header=0, index_col=0, dtype={"Age": str})
とすると、Age列も数値ではなく文字列となる
◦ 本来は文字列であるのだが、数値とみなせる列が混
ざっているときはこの指定が必要
◦ なおこの指定よりも keep_default_na のほうが優先
されるため、併用が吉
Name Age Birthplace
Alice 20 Aichi
Bob 30 Gifu
Charles 40 Mie
まとめ
pd.read_csv(ファイル名,
header=,
index_col=,
keep_default_na=,
dtype=)
ここまでテンプレと思おう!
デフォルト値を指定してもよいけど、何も考えずデフォル
ト値にするのはやめよう!
1 of 13

More Related Content

More from Hiro H.(20)

MSYS2使いはじめましたMSYS2使いはじめました
MSYS2使いはじめました
Hiro H.2.9K views

pandas便利だけどデフォルトパラメータでファイルを読み込むな!