Pythonでpandas入門1(データの入力とデータへのアクセス)

Pythonのデータ分析で用いられるpandasの入門編です。データの入力と、入力されたデータから必要な部分の取り出しについて解説します。

目次

  1. pandasのインポート
  2. pandasのデータ構造
  3. CSVファイルの読み取り
  4. DataFrameの情報を取得する
  5. データの参照

pandasのインポート

pandasをインポートする際には、一般的にpdという名前でインポートします。

import pandas as pd

pandasのデータ構造

pandasで使用するデータの構造として、DataFrameとSeriesというものがあります。

DataFrameは2次元の表のようなものです。縦のデータの集まりを列(column)、横の列の集まりを行(row)と言います。Excelのスプレッドシートのようなイメージです。各要素には、文字列や数値などを格納できます。

Seriesは、DataFrameの列を取り出したものです。

DataFrameとSerise

DataFrameの生成

DataFrameはDataFrameコンストラクタに、Keyを列名、Valueをデータとした辞書を指定して作成できます。

import pandas as pd

df = pd.DataFrame(
    {
        "Name": [
            "Windows",
            "OS X",
            "Chrome OS",
            "Linux",
            ],
        "World": [75.56, 16.48, 2.09, 1.97],
        "Japan": [65.88, 16.64, 0.51, 1.34],
        }
    )
print(type(df))
print(df)
print(type(df['World']))

実行するとこうなります。

<class 'pandas.core.frame.DataFrame'>
        Name  World  Japan
0    Windows  75.56  65.88
1       OS X  16.48  16.64
2  Chrome OS   2.09   0.51
3      Linux   1.97   1.34
<class 'pandas.core.series.Series'>

オブジェクトのタイプがDataFrameに、DaraFrameから切り出した列がSeriesになっています。

各行の一番左に0から始まる番号が割り振られています。これは各行(row)のインデックスです。

Seriesの生成

Seriesを作るには、DataFrameから切り出しても良いのですが、Seriesコンストラクタの引数にリストを指定することでSeriesオブジェクトを生成できます。

import pandas as pd

s = pd.Series([75.56, 16.48, 2.09, 1.97], name='World')
print(type(s))
print(s)

実行するとこうなります。

<class 'pandas.core.series.Series'>
0    75.56
1    16.48
2     2.09
3     1.97
Name: World, dtype: float64

Seriesにも各行にインデックスが付きます。

CSVファイルの読み取り

CSVファイルを読み込むには、read_csv()メソッドを使用します。

例えば、下記のようなCSVファイルがあるとします。

Name,World,Japan
Windows,75.56,65.88
OS X,16.48,16.64
Chrome OS,2.09,0.51
Linux,1.97,1.34

これを読み込んでDataFrameにします。

import pandas as pd

df = pd.read_csv('test.csv', encoding='shift_jis')
print(df)

CSVファイル内で日本語が使用されている場合は、エンコードを指定しないと文字化けする場合があります。多くはshift_jisかutf-8のどちらかです。

        Name  World  Japan
0    Windows  75.56  65.88
1       OS X  16.48  16.64
2  Chrome OS   2.09   0.51
3      Linux   1.97   1.34

DataFrameの情報を取得する

DataFrameのshapeプロパティで、行と列の数を取得できます。

DataFrameのindexプロパティでインデックスの情報を取得し、len()でその長さを計ると行数を取得できます。

DataFrameのcolumnsプロパティで列名のリストを取得し、len()でその長さを計ると列数を取得できます。

import pandas as pd

df = pd.read_csv('test.csv', encoding='shift_jis')
print(df)
print(df.shape)
print(df.index)
print(len(df.index))
print(df.columns)
print(len(df.columns))

出力はこうなります。

        Name  World  Japan
0    Windows  75.56  65.88
1       OS X  16.48  16.64
2  Chrome OS   2.09   0.51
3      Linux   1.97   1.34
(4, 3)
RangeIndex(start=0, stop=4, step=1)
4
Index(['Name', 'World', 'Japan'], dtype='object')
3

データの参照

print()でDataFrameを表示できますが、他にもいくつか表示する方法があります。

先頭または末尾の行を表示する

head(n)でデータの先頭n行分を、tail(n)でデータ末尾n行分を表示できます。

import pandas as pd

df = pd.read_csv('test.csv', encoding='shift_jis')
print(df.head(2))
print(df.tail(2))

下記のように出力されます。

      Name  World  Japan
0  Windows  75.56  65.88
1     OS X  16.48  16.64

        Name  World  Japan
2  Chrome OS   2.09   0.51
3      Linux   1.97   1.34

大きいデータの確認をする際に便利です。

特定の行を取得する

スライスを使って、特定の行を取得できます。

インデックスが1から2の行を取り出すには、下記のようにします。

import pandas as pd

df = pd.read_csv('test.csv', encoding='shift_jis')
print(df[1:3])

終端のインデックスの指定が2ではなく2+1であることに注意です。

        Name  World  Japan
1       OS X  16.48  16.64
2  Chrome OS   2.09   0.51

特定の列を取得する

列名を指定して、特定の列を取得できます。負数の列を取得する場合は、リストを指定します。

Japan列を取り出す場合と、Name列とJapan列を取り出す場合の例です。

import pandas as pd

df = pd.read_csv('test.csv', encoding='shift_jis')
print(df['Japan'])
print(df[['Name','Japan']])

複数行を指定する場合は[]の中にリストで指定することに注意です。

0    65.88
1    16.64
2     0.51
3     1.34
Name: Japan, dtype: float64

        Name  Japan
0    Windows  65.88
1       OS X  16.64
2  Chrome OS   0.51
3      Linux   1.34

特定の列の特定の行を取得する

上記を組み合わせてみます。

Name列とJapan列の、インデックス1~2のデータを取得してみます。

import pandas as pd

df = pd.read_csv('test.csv', encoding='shift_jis')
print(df[['Name','Japan']][1:3])

下記のように出力されます。

        Name  Japan
1       OS X  16.64
2  Chrome OS   0.51

DetaFrame内の位置を指定してデータを取得する

ilocプロパティを使って位置を指定してデータを取得します。iloc[n]でn行目のデータを、iloc[:,n]でn列目のデータを、iloc[m,n]でm行n列のデータを取得できます。

import pandas as pd

df = pd.read_csv('test.csv', encoding='shift_jis')
print(df.iloc[3])
print(df.iloc[:,2])
print(df.iloc[0,2])

iloc[3]で3行目のデータを取得した場合は、列名とデータのSeriesになっています。

Name     Linux
World     1.97
Japan     1.34
Name: 3, dtype: object

0    65.88
1    16.64
2     0.51
3     1.34
Name: Japan, dtype: float64

65.88

行ラベルや列ラベルを指定してデータを取得する

locプロパティを使って、ラベルを指定してデータを取得します。複数のラベルを指定する場合は、ラベルのリストで指定します。

import pandas as pd

df = pd.read_csv('test.csv', encoding='shift_jis')
print(df.loc[3])
print(df.loc[:,['Name','Japan']])
print(df.loc[0,'Japan'])
Name     Linux
World     1.97
Japan     1.34
Name: 3, dtype: object

        Name  Japan
0    Windows  65.88
1       OS X  16.64
2  Chrome OS   0.51
3      Linux   1.34

65.88

条件を付けてデータを取り出す

指定した行の値が条件を満たす行だけを取り出すことができます。

ブール演算を使って複数の条件式を指定することもできます。ただし、and、or、notの代わりに&、|、~を使用します。

import pandas as pd

df = pd.read_csv('test.csv', encoding='shift_jis')
print(df)
print(df[(df['World'] > 2.0) & (df['Japan'] < 50.0)])

条件式を括弧で括っていることに注意してください。

        Name  World  Japan
0    Windows  75.56  65.88
1       OS X  16.48  16.64
2  Chrome OS   2.09   0.51
3      Linux   1.97   1.34

        Name  World  Japan
1       OS X  16.48  16.64
2  Chrome OS   2.09   0.51

公開日

広告