チート・シートで学ぶPandas

Pandasは、データ・フレーム(Excelのシートに似た形)を処理するライブラリです。

Pythonをマスターするのに、表計算に慣れているなら、Pandasから学ぶのが近道です。

Pandasのチート・シートにそって学べば暗記しやすいですが、初心者にはチート・シートは???ですし、すべてを覚えるのは大変です。

そこで、チート・シートの見方と、まず暗記すべきよく使うスクリプトを説明します。

A.Syntax

データ・フレーム(表計算のシートの形)を作成する方法はいくつもありますが、dictionaryから作成するスクリプトを覚えるのがよいです。 DictionariesはJavaScriptの標準的なデータ形式のJSONと同様の形式です。Nestedなデータをうまく保存することができます。

下が辞書をするスクリプトです。{ }や[ ]があってややこしそうに見えますが、データの形式としては、[ ]はlists、{ }はdictionaries、( )はtuplesと覚えます。

辞書の作成については次がポイントです。

  1. 文字はシングル・クォーテーション(’)ではさみます。数ははさみません。

  2. : の左がキー(keys)で、右が値(values)です。keysを指定することによって値を取り出します。

  3. 値は[ ]ではさまれています。つまり、{文字:リスト} の形になっています。

  4. キーの重複は認められません。

mydic = {'a':[1, 2, 3],
  'b':[4, 5, 6],
  'c':[7, 8, 9]}
mydic
## {'a': [1, 2, 3], 'b': [4, 5, 6], 'c': [7, 8, 9]}

次に、辞書からデータ・フレームを作成します。

pd.DataFrame()は、DataFrame( )がPandasのファンクションであることを示しています。

インデクス(行名)を指定していないので、次のようにインデクスが0から始まる連番となります。表計算のシートと同じ形ですね。

# ライブラリーをインポート
import pandas as pd
mydf = pd.DataFrame(mydic)
mydf
##    a  b  c
## 0  1  4  7
## 1  2  5  8
## 2  3  6  9

補足

Cheat Sheetsにはないですが、CSVデータ読み込み方を紹介します。Pandasなら簡単です。

1.インターネット上のデータの読み込み

データのURLはrawのページのURLであることに注意してください。

試験結果のサンプルデータを読み込むスクリプトは次です。

df.head(10)は、dfという名のデータの先頭の10行を表示する、という意味です。

import pandas as pd
df = pd.read_csv("https://pastebin.com/raw/nWkAe1qR")
df.head(10)
##    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
## 5   6     33.3      75.6    japanese  literature     1   male
## 6   7     28.9      60.0    japanese  literature     1   male
## 7   8     53.3      88.9    japanese  literature     1   male
## 8   9     42.2      60.0    japanese  literature     1   male
## 9  10     40.0      80.0    japanese  literature     1   male

2.CSVファイルの読み込み

1のURLの代わりに、ダウンロードしたファイルの場所を指定します。

a.作業ディレクトリにファイルがある場合

作業しているディレクトリ(current working directory)にファイルを移動し、ファイル名(ドット以下を含む)を書きます。

df = pd.read_csv("ファイル名.csv")

現在の作業ディレクトリを確認するスクリプトは次です。

import osos.getcwd()

ディレクトリに移動するスクリプトは次です。chdirは、change directoriesの意味です。

os.chdir('ディレクトリのパス')

b.作業ディレクトリ下にファイルがない場合

Full pathを書きます。Macの場合のfull pathの取得方法は次に解説されています。

https://themacbeginner.com/copy-full-path-file-folder-finder-mac-osx/

B.行頭、行末、列の選択

通常のデータの処理では、Cheat SheetsのDの処理が先ですが、慣れるまで手間がかかります。慣れるまでは、表計算ソフトで整理するのが得策です。

データの内容を確認するのに、はじめの、あるいは、終わりの数行を表示します。

1.先頭と末尾の行の取得

アーギュメントが空白の場合、はじめの5行を表示します。左端の列はインデクスで0から始まります。

import pandas as pd
df = pd.read_csv("https://pastebin.com/raw/nWkAe1qR")
df.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

末尾の5行を表示します。

df.tail()
##       id  english  japanese nationality department  year  gender
## 195  196     66.7      55.6       nepal  economics     1    male
## 196  197     44.4      80.0       china  economics     1    male
## 197  198     57.8      48.9     vietnam  economics     1  female
## 198  199     86.7      26.7     vietnam  economics     1    male
## 199  200     24.4      68.9    japanese  economics     1    male

2.1列を取得

# english行の取得
df['english']
## 0      17.8
## 1      64.4
## 2      86.7
## 3      60.0
## 4      42.2
##        ... 
## 195    66.7
## 196    44.4
## 197    57.8
## 198    86.7
## 199    24.4
## Name: english, Length: 200, dtype: float64

次のように簡略にすることができます。

# english行の取得
df.english
## 0      17.8
## 1      64.4
## 2      86.7
## 3      60.0
## 4      42.2
##        ... 
## 195    66.7
## 196    44.4
## 197    57.8
## 198    86.7
## 199    24.4
## Name: english, Length: 200, dtype: float64

3.2列以上を取得

# englishとjapaneseとnationalityの列を取得
df[['english', 'japanese', 'nationality']]
##      english  japanese nationality
## 0       17.8      75.6    japanese
## 1       64.4      53.3       nepal
## 2       86.7      31.1       nepal
## 3       60.0      62.2   indonesia
## 4       42.2      80.0    japanese
## ..       ...       ...         ...
## 195     66.7      55.6       nepal
## 196     44.4      80.0       china
## 197     57.8      48.9     vietnam
## 198     86.7      26.7     vietnam
## 199     24.4      68.9    japanese
## 
## [200 rows x 3 columns]

4.Regular Expressionsで列を取得

列名が’r’で終わる列を取得するスクリプトは次です。

df.filter(regex = 'r$')
##      year  gender
## 0       1    male
## 1       1    male
## 2       1    male
## 3       1    male
## 4       1    male
## ..    ...     ...
## 195     1    male
## 196     1    male
## 197     1  female
## 198     1    male
## 199     1    male
## 
## [200 rows x 2 columns]

’a’を含む列を取り出すスクリプトは次です。

df.filter(regex = 'a')
##      japanese nationality  department  year
## 0        75.6    japanese  literature     1
## 1        53.3       nepal  literature     1
## 2        31.1       nepal  literature     1
## 3        62.2   indonesia  literature     1
## 4        80.0    japanese  literature     1
## ..        ...         ...         ...   ...
## 195      55.6       nepal   economics     1
## 196      80.0       china   economics     1
## 197      48.9     vietnam   economics     1
## 198      26.7     vietnam   economics     1
## 199      68.9    japanese   economics     1
## 
## [200 rows x 4 columns]

5.loc[ :, ] or iloc[ :, ]で列を取得

列名で列を取得

# 確認のために、はじめの5行を表示
print(df.head())
# japaneseからdepartmentまでの列を取得
##    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
df.loc[:,'japanese':'department']
##      japanese nationality  department
## 0        75.6    japanese  literature
## 1        53.3       nepal  literature
## 2        31.1       nepal  literature
## 3        62.2   indonesia  literature
## 4        80.0    japanese  literature
## ..        ...         ...         ...
## 195      55.6       nepal   economics
## 196      80.0       china   economics
## 197      48.9     vietnam   economics
## 198      26.7     vietnam   economics
## 199      68.9    japanese   economics
## 
## [200 rows x 3 columns]

列番号で列を取得

df.iloc[:,[2,3,4]]
##      japanese nationality  department
## 0        75.6    japanese  literature
## 1        53.3       nepal  literature
## 2        31.1       nepal  literature
## 3        62.2   indonesia  literature
## 4        80.0    japanese  literature
## ..        ...         ...         ...
## 195      55.6       nepal   economics
## 196      80.0       china   economics
## 197      48.9     vietnam   economics
## 198      26.7     vietnam   economics
## 199      68.9    japanese   economics
## 
## [200 rows x 3 columns]

C.行の取得

データdfのはじめの10件をdf_headと名付けます。

df_head = df.head(10)
df_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
## 5   6     33.3      75.6    japanese  literature     1   male
## 6   7     28.9      60.0    japanese  literature     1   male
## 7   8     53.3      88.9    japanese  literature     1   male
## 8   9     42.2      60.0    japanese  literature     1   male
## 9  10     40.0      80.0    japanese  literature     1   male

1.条件で行を取得

Englishの得点が50点以上を取り出します。

df_head[df_head.english >= 50]
##    id  english  japanese nationality  department  year gender
## 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
## 7   8     53.3      88.9    japanese  literature     1   male

2.一つの値で行を取得

nationality列がnepalの行を取り出します。

df_head[df_head.nationality == 'nepal']
##    id  english  japanese nationality  department  year gender
## 1   2     64.4      53.3       nepal  literature     1   male
## 2   3     86.7      31.1       nepal  literature     1   male

3.複数の値で行を取得

nationalityが’indonesia’と’japanese’の行を取り出します。

df_head[df_head.nationality.isin(['indonesia', 'japanese'])]
##    id  english  japanese nationality  department  year gender
## 0   1     17.8      75.6    japanese  literature     1   male
## 3   4     60.0      62.2   indonesia  literature     1   male
## 4   5     42.2      80.0    japanese  literature     1   male
## 5   6     33.3      75.6    japanese  literature     1   male
## 6   7     28.9      60.0    japanese  literature     1   male
## 7   8     53.3      88.9    japanese  literature     1   male
## 8   9     42.2      60.0    japanese  literature     1   male
## 9  10     40.0      80.0    japanese  literature     1   male

ここで、次のように、isin(‘列名’)とするとエラーが表示されます。

df_head.nationality.isin('indonesia')

「isin( )にはリストと同等なobjectsおけるに、文字列を置いている。」

TypeError: only list-like objects are allowed to be passed to isin(), you passed a [str]

ここで、次のように、isin(‘列名1’, ‘列名2’)とするとエラーが表示されます。

df_head.nationality.isin('indonesia', 'japanese')

「isin( )は、2個のアーギュメントをとるが、3個のアーギュメントをおいている」

TypeError: isin() takes 2 positional arguments but 3 were given

3個のアーギュメントと指摘されているのは、直前ののnationalityの列と( )内の2個のアーギュメントを加えた3個のことです。

[ ]を加えてリストにすると行ごとの真偽の一覧が作成されます。

df_head.nationality.isin(['indonesia', 'japanese'])
## 0     True
## 1    False
## 2    False
## 3     True
## 4     True
## 5     True
## 6     True
## 7     True
## 8     True
## 9     True
## Name: nationality, dtype: bool

df_head[bool]で、列を取得することができます。

先のスクリプトを再掲します。

df_head[df_head.nationality.isin(['indonesia', 'japanese'])]
##    id  english  japanese nationality  department  year gender
## 0   1     17.8      75.6    japanese  literature     1   male
## 3   4     60.0      62.2   indonesia  literature     1   male
## 4   5     42.2      80.0    japanese  literature     1   male
## 5   6     33.3      75.6    japanese  literature     1   male
## 6   7     28.9      60.0    japanese  literature     1   male
## 7   8     53.3      88.9    japanese  literature     1   male
## 8   9     42.2      60.0    japanese  literature     1   male
## 9  10     40.0      80.0    japanese  literature     1   male

To be continued.