ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Python -「Python初学者のためのPandas100本ノック」やってみた②

初めに

 「Python初学者のためのPandas100本ノック」に挑戦してみる過程をまとめています。本記事はデータ抽出である第14問から第32問についてまとめます。

データ抽出

14(列の抽出)

 列名を選択すると、列の抽出ができます。列の長さとデータ型も確認できます。

df = initialize1() #初期化
df["name"]


15(複数の列の抽出)

 複数の列の抽出するには, 次のように記述します。

df = initialize1() #初期化
df[["name", "sex"]]


16、17(行数を指定して抽出)

 行数を指定し、抽出するには、次のように行数を記述します。

# 【16】
# dfのindex(行)の4行目までを表示
df = initialize1() #初期化
df[:4]

 初めから第4行のように初めからの場合は数値を書かないでよいです。先頭行は 0 番目になるので、4行目までは 0~3行目までになります。

# 【17】
# dfのindex(行)の4行目から10行目までを表示
df = initialize1() #初期化
df[3:10]

 先頭行は 0 番目なので、4 行目の Index は 3 になります。

18 - 22(loc で DataFrame の内で条件を満たした行、列を抽出)

 loc を使うことで DataFrame 内で条件を満たした行、列を抽出することができます。loc では、基本的にラベルで行、列を指定します。

# 【18】
# locを使ってdf全体を表示
df = initialize1() #初期化
df.loc[:, :]

 [, ] の左側で行、右側で列を指定します。第 18 問では、どちらも指定していないので、すべての行、列を指定し表示することになります。

# 【19】
# locを使ってdfのfare列をすべて表示
df = initialize1() #初期化
df.loc[:, "fare"]

 第 19 問では、"fare" 列を指定しています。

# 【20】
# locを使ってdfのfare列の10のラベルまで表示
df = initialize1() #初期化
df.loc[:10,"fare"]

 第 20 問では、"fare" 列の0 行目から 10 行目までを指定し、表示しています。

# 【21】
# locを使ってdfのnameとticketの列をすべて表示
df = initialize1() #初期化
df.loc[:, ["name", "ticket"]]

 二つのラベルを指定したい場合は、第 21 問のように記述します。

# 【22】
# locを使ってdfのnameからcabinまでの列をすべて表示
df = initialize1() #初期化
df.loc[:, "name":"cabin"]

 列の範囲をラベルで指定することも可能です。第 22 問の場合は、"name" から "cabin" までのすべての列を指定し、表示しています。

23(iloc で DataFrame の内で条件を満たした行、列を抽出)

 iloc を用いると、インデックス(行番号、列番号)で行、列が抽出できます。

# 【23】
# ilocを使ってdfのage列を5行目まで表示
df = initialize1() #初期化
df.iloc[:5, 4]

 "age" 列は 4 列目にあるので, 列番号は 4 を指定しています。列番号を確認するには、head() などを用いて、表示させるとよいかと思います。

24(抽出したデータを csv ファイルにエクスポート)
# 【24】
# dfのname,age,sexの列のみ抽出しdf_copyに格納
# その後outputフォルダにcsvファイルで出力
# 出力ファイル名はsample.csv
df = initialize1() #初期化
df_copy = df[["name", "age", "sex"]]
df_copy.to_csv("../output/sample.csv")

 output フォルダに sample.csv として、csv ファイルにエクスポートされます。行番号、列名を削除して出力したいときは、引数に index=None, header=None をつけます。


25 - 27(条件で抽出)

 次のように条件で抽出することもできます。

# 【25】
# dfのage列の値が30以上のデータのみ抽出
df = initialize1() #初期化
df[df["age"] >= 30]
# 【26】
# dfのsex列がfemaleのデータのみ抽出
df = initialize1() #初期化
df[df["sex"] == "female"]
# 【27】
# dfのsex列がfemaleでかつageが40以上のデータのみ抽出
df = initialize1() #初期化
df[(df["sex"] == "female") & (df["age"] >= 40)]
28(query で条件を用いて行を抽出)

 第 27 問のように query を使わずとも行を抽出することはできますが、query メソッドを用いたほうが短く記述できます。

# 【28】
# queryを用いてdfのsex列がfemaleでかつageが40以上のデータのみ抽出
df = initialize1() #初期化
df.query('sex == "female" & age >= 40')
29(文字列の部分一致抽出)

 str.contains() を用いて、文字列の部分一致するものを抽出します。

# 【29】
# dfのname列に文字列「Mrs」が含まれるデータを表示
df = initialize1() #初期化
df.query('name.str.contains("Mrs")', engine="python")

 engine='python'を指定しないとエラーが出るようです。

30(select_dtypes でデータ型を使って抽出)

 特定のデータ型の列を抽出したい時はselect_dtypesを使用します。

# 【30】
# dfの中で文字列型の列のみを表示
df = initialize1() #初期化
df.select_dtypes(include="object")

 include の場合は、指定したデータ型を含む列を抽出します。exclude の場合は、指定したデータ型を含まない列を抽出します。

31(nunique で各列の要素数を確認)

 unique ではシリーズの要素を表示しましたが、nunique では各列の要素を表示します。

# 【31】
# dfの各列の要素数の確認
df = initialize1() #初期化
df.nunique()


32(要素の出現回数の確認)

 シリーズ内の各要素の出現回数は value_counts() を用いて確認できます。

# 【32】
# dfのembarked列の要素と出現回数の確認
df = initialize1() #初期化
df["embarked"].value_counts()