PythonとRのデータ・フレームにおける行と列の取得の「ふつうの」取得方法を紹介します。
PythonやRでは、データ・フレームの行と列の取得(subsets)に種々の方法があり、どれを使うのがよかいかまよいます。
Google Sheetsや他の表計算のアプリケーションに慣れたているなら、データ・フレームのsubsetsの取得方法の定番を決めておくと、実際のデータ処理にすぐに役立ちますし、暗記することも容易です。
初心者の場合、インターネット上のsubsetsの解説でわかりにくいのは、特に行を取り出す場合、indexで取り出すのが、列の値で取り出すかで取り出す式が異なることです。
簡単な例を示します。ある学校の200人の英語と日本語の試験結果からサンプル・データを作成します。
# データ・フレームを処理するためのライブライをインポート
import pandas as pd
# データを読み込む
df0 = pd.read_csv('https://pastebin.com/raw/nWkAe1qR')
# データの初めの5行を表示
df0.head()
## id english japanese nationality department year gender
## 0 1 17.8 75.6 japanese literature 1 male
## 1 2 64.4 53.3 nepal literature 1 male
## 2 3 86.7 31.1 nepal literature 1 male
## 3 4 60.0 62.2 indonesia literature 1 male
## 4 5 42.2 80.0 japanese literature 1 male
データを小さくしします。読み込んだデータからランダムに10行取り出します。
# 同じサンプルを使うためにシードを設定
df0.sample(10, random_state=1)
## id english japanese nationality department year gender
## 58 59 57.8 44.4 vietnam literature 1 female
## 40 41 24.4 60.0 japanese economics 1 male
## 34 35 62.2 82.2 japanese literature 1 male
## 102 103 62.2 55.6 vietnam economics 1 female
## 184 185 53.3 28.9 nepal economics 1 male
## 198 199 86.7 26.7 vietnam economics 1 male
## 95 96 28.9 31.1 japanese economics 1 male
## 4 5 42.2 80.0 japanese literature 1 male
## 29 30 26.7 53.3 japanese literature 1 male
## 168 169 33.3 71.1 vietnam economics 1 male
上のデータ・フレームの一番左の列がインデクス(行名)です。他の列に比べて1行さがっています。
2番目のid列はデータの一部です。
行を取得する場合、インデクスで指定するか、列の値で指定するかでコードが異なります。
次のsubsetを取得します。
df1 = df0.sample(10, random_state=1)
df1.set_index('id', inplace = True)
print(df1)
## english japanese nationality department year gender
## id
## 59 57.8 44.4 vietnam literature 1 female
## 41 24.4 60.0 japanese economics 1 male
## 35 62.2 82.2 japanese literature 1 male
## 103 62.2 55.6 vietnam economics 1 female
## 185 53.3 28.9 nepal economics 1 male
## 199 86.7 26.7 vietnam economics 1 male
## 96 28.9 31.1 japanese economics 1 male
## 5 42.2 80.0 japanese literature 1 male
## 30 26.7 53.3 japanese literature 1 male
## 169 33.3 71.1 vietnam economics 1 male
Pandasのseriesをset_index()のアーギュメントにします。
s = [num for num in range(1, 11)]
df1.set_index(pd.Series(s))
## english japanese nationality department year gender
## 1 57.8 44.4 vietnam literature 1 female
## 2 24.4 60.0 japanese economics 1 male
## 3 62.2 82.2 japanese literature 1 male
## 4 62.2 55.6 vietnam economics 1 female
## 5 53.3 28.9 nepal economics 1 male
## 6 86.7 26.7 vietnam economics 1 male
## 7 28.9 31.1 japanese economics 1 male
## 8 42.2 80.0 japanese literature 1 male
## 9 26.7 53.3 japanese literature 1 male
## 10 33.3 71.1 vietnam economics 1 male
あるいは、リストのリスト、つまり、[[num for num in range(1, 11)]]をset_index()のアーギュメントにすることもできます。
df1.set_index([s])
## english japanese nationality department year gender
## 1 57.8 44.4 vietnam literature 1 female
## 2 24.4 60.0 japanese economics 1 male
## 3 62.2 82.2 japanese literature 1 male
## 4 62.2 55.6 vietnam economics 1 female
## 5 53.3 28.9 nepal economics 1 male
## 6 86.7 26.7 vietnam economics 1 male
## 7 28.9 31.1 japanese economics 1 male
## 8 42.2 80.0 japanese literature 1 male
## 9 26.7 53.3 japanese literature 1 male
## 10 33.3 71.1 vietnam economics 1 male
nationality列のvietnamで行を取り出します。
df1 = df0.sample(10, random_state=1)
df1[df1['nationality'] == 'vietnam']
## id english japanese nationality department year gender
## 58 59 57.8 44.4 vietnam literature 1 female
## 102 103 62.2 55.6 vietnam economics 1 female
## 198 199 86.7 26.7 vietnam economics 1 male
## 168 169 33.3 71.1 vietnam economics 1 male
あるいは、次のように簡略化できます。
df1[df1.nationality == 'vietnam']
## id english japanese nationality department year gender
## 58 59 57.8 44.4 vietnam literature 1 female
## 102 103 62.2 55.6 vietnam economics 1 female
## 198 199 86.7 26.7 vietnam economics 1 male
## 168 169 33.3 71.1 vietnam economics 1 male
loc[]と|を用いて、nationality列のnepalとvietnamの行を取り出します。
|はorを意味します。また、locはlocationに由来します。
loc[]は、データ・フレームのsubsetを取り出す最も一般的な関数で、行名、列名をアーギュメントとします。
df1.loc[(df1.nationality == 'nepal') | (df1.nationality == 'vietnam')]
## id english japanese nationality department year gender
## 58 59 57.8 44.4 vietnam literature 1 female
## 102 103 62.2 55.6 vietnam economics 1 female
## 184 185 53.3 28.9 nepal economics 1 male
## 198 199 86.7 26.7 vietnam economics 1 male
## 168 169 33.3 71.1 vietnam economics 1 male
あるいは、isin()を用いて取り出すこともできます。このほうがコードが簡潔で理解しやすいです。
ます、各値の真偽の一覧を取得します。
df1_bool = df1.nationality.isin(['nepal', 'vietnam'])
df1_bool
## 58 True
## 40 False
## 34 False
## 102 True
## 184 True
## 198 True
## 95 False
## 4 False
## 29 False
## 168 True
## Name: nationality, dtype: bool
真となった行を取り出します。
df1[df1_bool]
## id english japanese nationality department year gender
## 58 59 57.8 44.4 vietnam literature 1 female
## 102 103 62.2 55.6 vietnam economics 1 female
## 184 185 53.3 28.9 nepal economics 1 male
## 198 199 86.7 26.7 vietnam economics 1 male
## 168 169 33.3 71.1 vietnam economics 1 male
To be continued.