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