I. 何をする?

PythonとRのデータ・フレームにおける行と列の取得の「ふつうの」取得方法を紹介します。

PythonやRでは、データ・フレームの行と列の取得(subsets)に種々の方法があり、どれを使うのがよかいかまよいます。

Google Sheetsや他の表計算のアプリケーションに慣れたているなら、データ・フレームのsubsetsの取得方法の定番を決めておくと、実際のデータ処理にすぐに役立ちますし、暗記することも容易です。

II.データ・フレームのインデクスと列(Python)

初心者の場合、インターネット上の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列はデータの一部です。

行を取得する場合、インデクスで指定するか、列の値で指定するかでコードが異なります

III.列と行のsubset(Python)

次のsubsetを取得します。

1.id列をインデクスに変更

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

2.インデクスを1−10に変更

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

3.特定の値で行を取り出す

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

4.同一列の複数の値で行を取り出す

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.