Pandasの基本(dataframe作成、データ抽出、csv読み込み等)

今回は、Pyhonでデータを扱う際に使えるととても便利な「Pandas」について解説したいと思います。

また、データを扱う際に使用する代表的なライブラリとして「numpy」がありますが、2つのライブラリの違いと使い分けについても解説します。

「numpy」の使い方については、「numpyの使い方とlistとの違いを比較」で解説していますので、そちらをご覧ください。 

目次

1. Pandasって何?(numpyと比較)

「Pandas」とは、Pythonでデータを扱うためのライブラリで、データを表形式で扱うことができます。

データを扱うライブラリというと、代表的なものに「numpy」がありますが、「numpy」との違いは下記のようなものです。

pandasとnumpyの違い

  • numpyは全ての要素が同じ型でなければならないがpandasでは様々な型を使用可能
  • pandasではデータに欠損があった場合でも読み込み可能

 

上記の違いだけを見ると、「pandas」の方が優れているように思えますが、numpy」は計算に特化しており、計算速度は圧倒的に「numpy」の方が速いです。

そのため、下記のように使い分けることをお勧めします。

pandasとnumpyの使い分け

  • 要素ごとに形式が違ったり欠測のあるデータの整理にはpandasを使用
  • 数値のみの配列を扱う、または計算を行う場合はnumpyを使用

では、次の章からは実際にコードを動かしながら「pandas」の基本的な使い方について解説していきます。 

2. Pandasの基本的な使い方(dataframeの作成)

「pandas」ではデータを表形式で扱うと説明しましたが、「pandas」で作成するこの表形式のデータのことをdataframe(データフレーム)と呼びます。

この「dataframe」は、「pandas.DataFrame(配列)」という形式で作成できます。

このとき、DataFrameの「D」と「F」は大文字でなければエラーになりますので、注意してください。

 

では、実際にdataframeを作成してみましょう。

import pandas as pd
#list配列の作成
data = [[80,75,90,70,95],[95,80,75,90,65]]
#dataframe作成
df = pd.DataFrame(data)

上のコードを実行すると、「df」というdataframeが作成されます。作成されたdataframeは下記のような形ですね。

8075907095
9580759065

※ちなみに、今回は読み込ませる配列をlistにしましたが、numpyなどの配列でも読み込み可能です。

 

さて、ここまでは普通の配列と変わりませんが、「pandas」ではこの行や列に名前を付けることができます。

では、実際に名前を付けてみましょう。先ほどのコードに続けて、下のコードを実行してください。

#列名の指定
df.columns = ["国語", "算数", "理科", "社会", "英語"]
#行名の指定(index)
df.index = ["太郎", "花子"]

すると、行と列にそれぞれ名前が付き、表形式のようになりましたね。

(上の配列はspyderの変数エクスプローラーで確認しています。詳しくは「Spyderの基本と便利な使い方」をご覧ください。)

 

ちなみに行列名は、下のようにdataframe作成時に「columns=」と「index=」で指定することもできます。

import pandas as pd
#list配列の作成
data = [[80,75,90,70,95],[95,80,75,90,65]]
#行列名の作成
col = ["国語", "算数", "理科", "社会", "英語"]
ind = ["太郎", "花子"]
#dataframe作成
df = pd.DataFrame(data, columns=col, index=ind)

 

また、indexはについては、「df.set_index()」を用いることで、データ作成後に列名を指定してindexにすることもできます。

import pandas as pd
#list配列の作成
data = [["太郎",80,75,90,70,95],["花子",95,80,75,90,65]]
#dataframe作成
df = pd.DataFrame(data)
#indexの列を指定
df = df.set_index(0)

 

ここまでくれば、あとはこの行や列ごとに平均を出したり、並べ替えたりといろいろな処理を行うことができます。

次の章では、まずこのdataframeからのデータ抽出方法について解説します。

  • pandasのdataframeは「pd.DataFrame(配列)」という形式で作成
  • 「df.columns =[リスト]」で列名を指定
  • 「df.index =[リスト]」で行名(index)を指定
  • 行名(index)は「df.set_index()」を用いて後からindexにする列を指定可能

3. Pandas(dataframe)からのデータ抽出

ここでは、作成したdataframeからのデータの取り出し方法について解説します。

dataframeからデータを取りだす方法は、大きく分けて次の2つです。

また、上記2つの方法に共通し、「範囲を指定して抽出する方法」もあります。

では、この3つについてそれぞれ解説していきます。 

3.1. 行列名を指定して抽出

まずは、行列名を指定したデータ抽出方法について解説します。

行列名を指定する場合、それぞれ下記のように指定します。

行名を指定df.loc[“行名”]
列名を指定df[“列名”]
行列両方を指定df.loc[“行名”, “列名”]

では、実際にコードを動かして確認してみましょう。

import pandas as pd
#list配列の作成
data = [[80,75,90,70,95],[95,80,75,90,65]]
#行列名の作成
col = ["国語", "算数", "理科", "社会", "英語"]
ind = ["太郎", "花子"]
#dataframe作成
df = pd.DataFrame(data, columns=col, index=ind)

#国語の点数を抜き出し
Japanese = df["国語"]
#太郎の点数を抜き出し
Taro = df.loc["太郎"]
#花子の算数の点数を抜き出し
Hanako = df.loc["花子", "算数"]

上のコードを実行すると、Japaneseには二人の国語の点数が、Taroには太郎の点数が、Hanakoには花子の算数の点数がそれぞれ入っていますね。

ちなみに、Dataframeから行や列を指定して抜き出した1次元の配列をSeries」と言います。 

3.2. 行列の番号を指定して抽出

次に、行番号や列番号を指定してデータを抽出する方法について解説します。

行列の番号を指定する場合、基本的にはdf.iloc[行番号, 列番号]」という風に指定します。

ただし、行数や列数のみ指定したい場合は、指定しない方を「:」にすることで指定することができます。(「:」は、すべての範囲という意味になるため)

まとめると、下のように使い分けます。

行数を指定df.iloc[“行数”, :]
列数を指定df.iloc[:, “列数”]
行列数を指定df.iloc[“行数”, “列数”]

では、実際にコードで確認してみましょう。

import pandas as pd
#list配列の作成
data = [[80,75,90,70,95],[95,80,75,90,65]]
#行列名の作成
col = ["国語", "算数", "理科", "社会", "英語"]
ind = ["太郎", "花子"]
#dataframe作成
df = pd.DataFrame(data, columns=col, index=ind)

#国語の点数を抜き出し(列数指定)
Japanese = df.iloc[:, 0]
#太郎の点数を抜き出し(行数指定)
Taro = df.iloc[0, :]
#花子の算数の点数を抜き出し(行列数指定)
Hanako = df.iloc[1, 1]

これで、行列名を指定した場合と同じようにデータを抽出できましたね。

行列数の指定は、行列名がしっかり決まっていない時に使用することになります。 

3.3. 範囲指定を指定したデータ抽出

最後に、範囲を指定する場合について解説し、データの抽出方法をまとめたいと思います。

範囲を指定する場合は、前項の方法で行列を指定する際に、「始まり:終わり」のようにして指定することができます。

では、具体例を確認してみましょう。(前項のdataframeを使用しています)

#花子の算数から社会の点数を抜き出し
Hanako2 = df.loc["花子", "算数":"社会"]
Hanako3 = df.iloc[1, 1:4]

上のように「始まり:終わり」とすることで、その範囲のデータを抜き出すことができます。(行列名でも行列数でも同様に処理できます。) 

3.4. データ抽出のまとめ

ここまで解説したデータ抽出方法をまとめると以下のようになります。

行名を指定df.loc[“行名”]
列名を指定df[“列名”]
行列名を指定df.loc[“行名”, “列名”]
行数を指定df.iloc[“行数”, :]
列数を指定df.iloc[:, “列数”]
行列数を指定df.iloc[“行数”, “列数”]

範囲を指定
df.loc[“始行名”:”終行名”, “始列名”:”終列名”]
         or
df.iloc[“始行数”:”終行数”, “始列数”:”終列数”]
  • 行列を名前で指定する場合は「df.loc[“行名”, “列名”]」
  • 行列を数字で指定する場合は「df.icol[“行数”, “列数”]」
  • 範囲を指定する場合は行列を「始まり:終わり」で指定

4. Pandasによるcsvの読み込み(read_csv)

最後に、pandasによるcsvの読み込みについて解説します。

pandasでcsvを読み込む場合には、「read_csv」を使用します。

では、実際にコードを動かしながら確認してみましょう。

今回は下のようなcsvファイル読み込んでみます。(ファイル名はcsv_data.csvです)

import pandas as pd
df = pd.read_csv("csv_data.csv", header=0, index_col=0, encoding="SHIFT-JIS")

これで下のようにcsvデータを読み込むことができました。コードとしてはかなり簡単ですね。

 

上のコードでread_csvを使用した際のポイントは下の点です。

  • 「header=」でヘッダー(列名)の行を指定できる
  • 「index_col=」でindexの列を指定できる
  • 日本語を読み込む場合は「encoding=”SHIFT-JIS”」を使う

 

ちなみに、ヘッダーが無いデータを読み込む場合は下の2種類の方法があります。

  • header=Noneとすることで、ヘッダー無しのデータを読み込む
  • names=[リスト]とすることで、列名を指定して読み込む

また、index_colは指定しなければ読み込まないため、indexが無い場合は指定しなくて構いません。

 

このように、pandasではcsvのデータを簡単に表形式に読み込むことができます。

 

ちなみに、データに欠損(空白など)がある場合は「nan」に変換されます。また、na_valuesを用いることで、欠損値の指定をすることもできます。

上と同じ方法で読み込むと、空白のみが欠損となり「nan」に変換される。

 

下のように、「na_values」で「欠席」も欠損値に指定することができる。

import pandas as pd
df = pd.read_csv("csv_data.csv", header=0, index_col=0,na_values="欠席", encoding="SHIFT-JIS")
  • pandasでcsvを読み込む場合は「read_csv」を使用
  • 「header=」でヘッダー(列名)の行を指定
  • 「index_col=」でindexの列を指定
  • 「header=None」とすることでヘッダー無しのデータの読み込み
  • 「names=[リスト]」とすることで列名を指定して読み込み
  • 「na_values=」で欠損値を指定

5. おわりに

今回は、pythonでデータを扱う際に使えると便利な「pandas」について解説しました。

最初は少し難しく感じるかもしれませんが、「pandas」は使えるようになるとかなり便利なので、ぜひ使い方をマスターしてください。

ちなみに、このサイトでは初心者の方向けに「Python初心者入門講座」という講座を作っていますので、気になった方はそちらもご覧いただけると幸いです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

このブログを運営している人

非エンジニア職の社会人です。
業務の単純作業が苦手で、何とかしたいと思いプログラミングを習得しました。
このサイトが同じ悩みを抱える人の助けになれば良いなと考えています。

コメント

コメントする

目次