Pandasは、データ・フレーム(Excelのシートに似た形)を処理するライブラリです。
Pythonをマスターするのに、表計算に慣れているなら、Pandasから学ぶのが近道です。
Pandasのチート・シートにそって学べば暗記しやすいですが、初心者にはチート・シートは???ですし、すべてを覚えるのは大変です。
そこで、チート・シートの見方と、まず暗記すべきよく使うスクリプトを説明します。
データ・フレーム(表計算のシートの形)を作成する方法はいくつもありますが、dictionaryから作成するスクリプトを覚えるのがよいです。 DictionariesはJavaScriptの標準的なデータ形式のJSONと同様の形式です。Nestedなデータをうまく保存することができます。
下が辞書をするスクリプトです。{ }や[ ]があってややこしそうに見えますが、データの形式としては、[ ]はlists、{ }はdictionaries、( )はtuplesと覚えます。
辞書の作成については次がポイントです。
文字はシングル・クォーテーション(’)ではさみます。数ははさみません。
: の左がキー(keys)で、右が値(values)です。keysを指定することによって値を取り出します。
値は[ ]ではさまれています。つまり、{文字:リスト} の形になっています。
キーの重複は認められません。
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なら簡単です。
データの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
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/
通常のデータの処理では、Cheat SheetsのDの処理が先ですが、慣れるまで手間がかかります。慣れるまでは、表計算ソフトで整理するのが得策です。
データの内容を確認するのに、はじめの、あるいは、終わりの数行を表示します。
アーギュメントが空白の場合、はじめの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
# 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
# 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]
列名が’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行を表示
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]
データ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
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
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
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.