Pandas.DataFrameの基礎 – 【Pythonプログラミング3 ~Pandas編~】

PROGRAMMING

PandasのDataFrameを扱う方法を、演習用プログラムのソースコードを使い、それを実行しながら解説します。

1.演習用プログラムのダウンロード

演習用プログラム( practice19.py )、Excelファイル( 商品一覧.xlsx )、CSVファイル( 追加商品.csv )をダウンロードします。
演習用プログラムは テキストファイルになっているので、エクスプローラーを使って拡張子を .txt から .py に変更します。
practice19.py、商品一覧.xlsx、追加商品.csv を Python をインストールしたフォルダ(今回は C:\Python)に置きます。




2.ソースコードの表示

メモ帳を使って、演習用プログラム( practice19.py )を開きます。

practice19.py

practice19.py


3.Pandas と DataFrame について

Pandas とは、データ解析を容易にする機能を持つPythonのデータ解析ライブラリです。
CSVファイルや、Excelファイルのような表形式データを扱うときにもとても便利です。
Pandas には2つの主要なデータ構造があり、Series(シリーズ)が1次元のデータ、DataFrame(データフレーム)が2次元のデータに対応します。
本章では、DataFrame について解説します。

4.DataFrameの作成

① 直接データを入力した作成

コマンドプロンプト で practice19.py を実行します。
プログラムを実行する方法は、こちらの記事『ファイルに保存されたプログラムの実行』を参照します。
以下のように表示されます。

#
# DataFrameの作成(直接データを入力した作成)
#

*** データを2次元リストで用意 ***

[['みかん', 100], ['メロン', 200], ['レモン', 300]]

*** 列名をリストで用意 ***

['商品名', '単価']

*** インデックスをリストで用意 ***

['A0001', 'A0002', 'A0003']

*** 2次元リストからDataFrameを作成  pandas.DataFarme ***

       商品名   単価
A0001  みかん  100
A0002  メロン  200
A0003  レモン  300
(行数:3、列数:2)
商品名    object
単価      int64
dtype: object

 
3つの果物の名前とそれぞれの単価が入った2次元リストと、列名のリスト、インデックスのリストを使って、DataFrameを作成しました。

インデックス 商品名 単価
A0001 みかん 100
A0002 メロン 200
A0003 レモン 300

プログラムソースを確認します。


26 # データを2次元リストで用意
27 print("\n*** データを2次元リストで用意 ***\n")
28 list2D = [['みかん', 100], ['メロン', 200], ['レモン', 300]]
29 print(list2D)
30 
31 # 列名をリストで用意
32 print("\n*** 列名をリストで用意 ***\n")
33 col = ['商品名','単価']
34 print(col)
35 
36 # インデックスをリストで用意
37 print("\n*** インデックスをリストで用意 ***\n")
38 idx = ['A0001','A0002','A0003']
39 print(idx)
40 
41 # DataFrameを作成
42 print("\n*** 2次元リストからDataFrameを作成  pandas.DataFarme ***\n")
43 df商品一覧 = pd.DataFrame(data = list2D, columns = col, index = idx)
44 

49 #終了1
50 #sys.exit()

DataFrameを作成するためにデータが入った2次元リスト、列名のリスト、インデックスのリストを用意します。
28行目で、DataFrameに入れるデータを2次元リストで用意しています。
33行目で、列名をリストで用意しています。
38行目で、インデックスをリストで用意しています。
43行目で、DataFrameを作成しています。

5.ExcelファイルからDataFrameを作成(基本編)

① Excelファイルから作成

ソースコード #終了1 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

#
# ExcelファイルからDataFrameを作成(基本)
#

商品一覧ファイル名:C:\Python\商品一覧.xlsx

*** Excelファイルを読み込んでDataFrameを作成  pandas.read_excel ***

   商品コード  商品名  単価  産地
0  A0001       みかん   100  和歌山
1  A0002       メロン   200  茨城県
2  A0003       レモン   300  広島県
3  A0004       りんご   400  青森県
4  A0005       バナナ   500  沖縄県
(行数:5、列数:4)
商品コード  object
商品名      object
単価        int64
産地        object
dtype: object

 
Excelファイル(商品一覧.xlsx)を読み込んで、5行4列のDataFrameを作成しました。
DataFrame作成時にインデックスを指定していません。よって、インデックスには 0、1、2、3、4 が自動で振られています。

インデックス 商品コード 商品名 単価 産地
0 A0001 みかん 100 和歌山
1 A0002 メロン 200 茨城県
2 A0003 レモン 300 広島県
3 A0004 りんご 400 青森県
4 A0005 バナナ 500 沖縄県

プログラムソースを確認します。


64 filename = dirHome + r"\商品一覧.xlsx"
65 print("\n商品一覧ファイル名:" + filename)
66 
67 # DataFrameを作成
68 print("\n*** Excelファイルを読み込んでDataFrameを作成  pandas.read_excel ***\n")
69 df商品一覧 = pd.read_excel(filename, sheet_name = 'Sheet1')
70 

75 #終了2
76 #sys.exit()

69行目で、read_excel()を使い、Excelのファイル名とシート名を指定してDataFrame(df商品一覧)を作成しています。

6.ExcelファイルからDataFrameを作成(実践編)

① Excelファイルから作成

商品一覧.xlsx の Sheet2 を開いてください。
Excelの表が以下の場合について、読み込む方法を解説します。
・表が1行目から始まっていない。
  →今回は、3行目から始まっている表を読み込みます
・不要な列が含まれている。
  →今回は、産地、商品コード、商品名、単価の4つの列を読み込みます
・空の行が含まれている。
  →DataFrameを作成後に、空の行の条件に沿って削除します
・空のセルが含まれている。
  →空のセルを処理します

ソースコード #終了2 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

#
# ExcelファイルからDataFrameを作成(実践)
#

商品一覧ファイル名:C:\Python\商品一覧.xlsx

*** Excelファイルを読み込んでDataFrameを作成  pandas.read_excel ***

   産地    商品コード  商品名   単価
0  茨城県  A0002       メロン  200.0
1  沖縄県  A0005       バナナ  500.0
2  和歌山  A0001       みかん  100.0
3  NaN     A0004       りんご  400.0
4  広島県  A0003       レモン  300.0
5  熊本県  NaN         スイカ    NaN
6  NaN     NaN         NaN       NaN
7  NaN     NaN         NaN       NaN
(行数:8、列数:4)
産地        object
商品コード  object
商品名      object
単価        float64
dtype: object

解説:
NaN(Not a Number)は欠損値です。
データが存在しない、または無効であることを示します。

 
NaN(Not a Number)は欠損値です。データが存在しない、または無効であることを示します。
インデックス 6、7 が空行になります。
インデックス 3、5 に空のセルが含まれています。
単価が 浮動小数点数(float64)になっています。

プログラムソースを確認します。


 92 # DataFrameを作成
 93 print("\n*** Excelファイルを読み込んでDataFrameを作成  pandas.read_excel ***\n")
 94 df商品一覧 = pd.read_excel(filename,               # Excelファイル名
 95                            sheet_name = 'Sheet2',  # シート名
 96                            header     = 2,         # 見出し(列名)となる行(ゼロ始まり)
 97                            usecols    = ['産地','商品コード','商品名','単価'])  # 読み込む列名
 98 

107 #終了3
108 #sys.exit()

94行目の read_excel() でExcelファイルを読み込んでいます。
95行目で、sheet_name引数 にシート名(Sheet2)を指定しています。
96行目で、header引数 に3行目(ゼロ始まりなので 2 を指定)から読み込むよう指定しています。
97行目で、usecols引数 に読み込む列名のリストを指定しています。

② 空行を削除する

ソースコード #終了3 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

*** 空行を削除  DataFrame.dropna ***

   産地    商品コード  商品名   単価
0  茨城県  A0002       メロン  200.0
1  沖縄県  A0005       バナナ  500.0
2  和歌山  A0001       みかん  100.0
3  NaN     A0004       りんご  400.0
4  広島県  A0003       レモン  300.0
(行数:5、列数:4)

解説:
商品コード、商品名、単価のいずれかに欠損値(NaN)が含まれる行を削除しました。

 
空行(条件:商品コード、商品名、単価のいずれかに欠損値(NaN)が含まれる行)を削除しました。

プログラムソースを確認します。


111 # 空行を削除する
112 print("\n*** 空行を削除  DataFrame.dropna ***\n")
113 df商品一覧 = df商品一覧.dropna(subset = ['商品コード','商品名','単価'])
114 

121 #終了4
122 #sys.exit()

113行目の dropna() で欠損値(NaN)が含まれる行を削除しています。
このとき、subset引数 に列名のリストを指定すると、いずれかに欠損値(NaN)が含まれる行が削除の対象になります。

③ 欠損値を空文字で埋める

ソースコード #終了4 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

*** 欠損値を空文字で埋める  DataFrame.fillna ***

   産地    商品コード  商品名   単価
0  茨城県  A0002       メロン  200.0
1  沖縄県  A0005       バナナ  500.0
2  和歌山  A0001       みかん  100.0
3          A0004       りんご  400.0
4  広島県  A0003       レモン  300.0
(行数:5、列数:4)

 
インデックス 3 の産地の欠損値(NaN)を空文字で埋めました。

プログラムソースを確認します。


125 # 欠損値を空文字で埋める
126 print("\n*** 欠損値を空文字で埋める  DataFrame.fillna ***\n")
127 df商品一覧 = df商品一覧.fillna("")
128 

132 #終了5
133 #sys.exit()

127行目の fillna() の 引数に空文字("")を指定することで、欠損値(NaN)が空文字に置き換わります。

④ データ型を変更する

ソースコード #終了5 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

*** 単価のデータ型を整数に変更する  DataFrame.astype ***

   産地    商品コード  商品名  単価
0  茨城県  A0002       メロン   200
1  沖縄県  A0005       バナナ   500
2  和歌山  A0001       みかん   100
3          A0004       りんご   400
4  広島県  A0003       レモン   300
(行数:5、列数:4)
産地       object
商品コード    object
商品名      object
単価        int64
dtype: object

 
単価を 浮動小数点数(float64)から、整数(int64)に変更しました。

プログラムソースを確認します。


136 # データ型を変更する
137 print("\n*** 単価のデータ型を整数に変更する  DataFrame.astype ***\n")
138 df商品一覧 = df商品一覧.astype({'単価': int})
139 

144 #終了6
145 #sys.exit()

138行目で astype() の引数に、辞書(データ型を変更したい列名 と 変更後のデータ型)を指定しています。

⑤ 列を並び替える

ソースコード #終了6 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

*** 列の並び替え ***

   商品コード  商品名  単価  産地
0  A0002       メロン   200  茨城県
1  A0005       バナナ   500  沖縄県
2  A0001       みかん   100  和歌山
3  A0004       りんご   400
4  A0003       レモン   300  広島県
(行数:5、列数:4)

 
商品コード、商品名、単価、産地 の順で列を並び替えました。

プログラムソースを確認します。


148 # 列の並び替え
149 print("\n*** 列の並び替え ***\n")
150 df商品一覧 = df商品一覧[['商品コード','商品名','単価','産地']]
151 

155 #終了7
156 #sys.exit()

150行目で、列名のリストを指定することで、そのリストの要素順で列を並び替えることができます。

⑥ 行を並び替える(ソート)

ソースコード #終了7 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

*** 商品コードでソート ***

   商品コード  商品名  単価  産地
0  A0001       みかん   100  和歌山
1  A0002       メロン   200  茨城県
2  A0003       レモン   300  広島県
3  A0004       りんご   400
4  A0005       バナナ   500  沖縄県
(行数:5、列数:4)

 
商品コードの昇順で行を並び替えました。(ソート)

プログラムソースを確認します。


159 # 行の並び替え
160 print("\n*** 商品コードでソート ***\n")
161 df商品一覧 = df商品一覧.sort_values('商品コード', ignore_index = True)
162 

166 #終了8
167 #sys.exit()

161行目の、sort_values()を使って、商品コード でソートしています。
ascending引数に、True を指定すると昇順ソート(規定値)、False を指定すると降順ソートになります。
ignore_index引数に、True を指定すると、インデックスがゼロ始まりの連番に振り直されます。

7.CSVファイルからDataFrameを作成

① CSVファイルから作成

ソースコード #終了8 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

#
# CSVファイルからDataFrameを作成
#

追加商品ファイル名:C:\Python\追加商品.csv

*** CSVファイルを読み込んでDataFrameを作成  pandas.read_csv ***

   商品コード  商品名  単価  産地
0  A0006       ぶどう   600  千葉県
1  A0007       スイカ   700  熊本県
2  A0008       イチゴ   800  栃木県
3  A0009       カシス   900  NaN
4  A0010       ライム  1000  NaN
(行数:5、列数:4)
商品コード  object
商品名      object
単価        int64
産地        object
dtype: object

 
NaN(Not a Number)は欠損値です。データが存在しない、または無効であることを示します。

プログラムソースを確認します。


181 filename = dirHome + r"\追加商品.csv"
182 print("\n追加商品ファイル名:" + filename)
183 
184 # DataFrameを作成
185 print("\n*** CSVファイルを読み込んでDataFrameを作成  pandas.read_csv ***\n")
186 df追加商品 = pd.read_csv(filename,      # CSVファイル名
187                          header   = 1,  # 見出し(列名)となる行(ゼロ始まり)
188                          usecols  = ['産地','商品コード','商品名','単価'],  # 読み込む列名
189                          encoding = 'cp932')  # 文字コード
190 

195 #終了9
196 #sys.exit()

186行目の read_csv() でCSVファイルを読み込んでいます。
187行目で、header引数 に2行目(ゼロ始まりなので 1 を指定)から読み込むよう指定しています。
188行目で、usecols引数 に読み込む列名のリストを指定しています。
189行目で、encoding引数 に読み込むCSVファイルの文字コードを指定しています。('cp932'、'utf-8' 等)

② 欠損値を文字'不明'で埋める

ソースコード #終了9 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

*** 欠損値を文字'不明'で埋める  DataFrame.fillna ***

   商品コード  商品名  単価  産地
0  A0006       ぶどう   600  千葉県
1  A0007       スイカ   700  熊本県
2  A0008       イチゴ   800  栃木県
3  A0009       カシス   900  不明
4  A0010       ライム  1000  不明
(行数:5、列数:4)

 
インデックス 3 と 4 の産地の欠損値(NaN)を 不明 の文字で埋めました。

プログラムソースを確認します。


199 # 欠損値を文字'不明'で埋める
200 print("\n*** 欠損値を文字'不明'で埋める  DataFrame.fillna ***\n")
201 df追加商品 = df追加商品.fillna("不明")
202 

206 #終了10
207 #sys.exit()

201行目の fillna() の引数に文字列を指定することで、欠損値(NaN)をその文字列で埋めることができます。

8.DataFrameの結合(縦方向)

① 2つのDataFrameの結合(縦方向)

商品一覧.xlsx から作成したDataFrameと、追加商品.csv から作成したDataFrameを結合します。

ソースコード #終了10 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

#
# 2つのDataFrameの結合(縦方向)
#

*** DataFrameを結合(縦方向)  pandas.concat ***

   商品コード  商品名  単価  産地
0  A0001       みかん   100  和歌山
1  A0002       メロン   200  茨城県
2  A0003       レモン   300  広島県
3  A0004       りんご   400
4  A0005       バナナ   500  沖縄県
5  A0006       ぶどう   600  千葉県
6  A0007       スイカ   700  熊本県
7  A0008       イチゴ   800  栃木県
8  A0009       カシス   900  不明
9  A0010       ライム  1000  不明
(行数:10、列数:4)

 
商品一覧.xlsx から作成したDataFrameの末尾に、追加商品.csv から作成したDataFrameが結合しています。

商品一覧
インデックス 商品コード 商品名 単価 産地
0 A0001 みかん 100 和歌山
1 A0002 メロン 200 茨城県
2 A0003 レモン 300 広島県
3 A0004 りんご 400
4 A0005 バナナ 500 沖縄県
追加商品
インデックス 商品コード 商品名 単価 産地
0 A0006 ぶどう 600 千葉県
1 A0007 スイカ 700 熊本県
2 A0008 イチゴ 800 栃木県
3 A0009 カシス 900 不明
4 A0010 ライム 1000 不明
DataFrameを結合(縦方向)
インデックス 商品コード 商品名 単価 産地
0 A0001 みかん 100 和歌山
1 A0002 メロン 200 茨城県
2 A0003 レモン 300 広島県
3 A0004 りんご 400
4 A0005 バナナ 500 沖縄県
5 A0006 ぶどう 600 千葉県
6 A0007 スイカ 700 熊本県
7 A0008 イチゴ 800 栃木県
8 A0009 カシス 900 不明
9 A0010 ライム 1000 不明

プログラムソースを確認します。


221 # DataFrameを結合(縦方向)
222 print("\n*** DataFrameを結合(縦方向)  pandas.concat ***\n")
223 df商品一覧 = pd.concat([df商品一覧, df追加商品], ignore_index = True)
224 

228 #終了11
229 #sys.exit()

223行目の、concat() の引数に結合したいDataFrameのリストを指定しています。
ignore_index引数に、True を指定すると、インデックスがゼロ始まりの連番に振り直されます。

9.DataFrameをファイルへ出力

① Excelファイルに出力

ソースコード #終了11 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

#
# DataFrameをExcelファイルに出力
#

Excelファイル名:C:\Python\Excel出力.xlsx

*** Excelファイルに出力  DataFrame.ExcelWriter ***

   商品コード  商品名  単価  産地
0  A0001       みかん   100  和歌山
1  A0002       メロン   200  茨城県
2  A0003       レモン   300  広島県
3  A0004       りんご   400
4  A0005       バナナ   500  沖縄県
5  A0006       ぶどう   600  千葉県
6  A0007       スイカ   700  熊本県
7  A0008       イチゴ   800  栃木県
8  A0009       カシス   900  不明
9  A0010       ライム  1000  不明

 
作成されたExcelファイル(Excel出力.xlsx)を確認してください。

プログラムソースを確認します。


243 filename = dirHome + r"\Excel出力.xlsx"
244 print("\nExcelファイル名:" + filename)
245 
246 # Excelファイルに出力
247 print("\n*** Excelファイルに出力  DataFrame.ExcelWriter ***\n")
248 print(df商品一覧)
249 with pd.ExcelWriter(filename, 
250                     mode   = 'w',               # 書き込みモード
251                     engine = 'openpyxl'         # 書き込みにopenpyxlを使用
252                    ) as writer:
253   df商品一覧.to_excel(writer, 
254                       sheet_name = '商品一覧',  # シート名
255                       index      = False)       # インデックスを出力しない
256 
257 #終了12
258 #sys.exit()

249行目の ExcelWriter() と、253行目の to_excel() を使ってExcelファイルに出力しています。
250行目の mode引数 に 'w' を指定することで書き込みモード(上書き)にしています。
251行目の engine引数 では、Excelファイル出力を openpyxl ライブラリを使用。
254行目の sheet_name引数 で、シート名を付けています。
255行目の index引数 を False にすることで、インデックス部分(0、1、2、… 、8、9)をExcelファイルに出力しないようにしています。

② CSVファイルに出力

ソースコード #終了12 の1行下の sys.exit() の先頭に「 # 」を入れてコメントにします。
 Ctrl  キーを押しながら、 S  キーを押して、ソースコードを上書き保存します。
コマンドプロンプトで F3  キーを押して、 Enter  キーを押下します。
以下のように表示されます。

#
# DataFrameをCSVファイルに出力
#

CSVファイル名:C:\Python\CSV出力.csv

*** CSVファイルに出力  DataFrame.to_csv ***

   商品コード  商品名  単価  産地
0  A0001       みかん   100  和歌山
1  A0002       メロン   200  茨城県
2  A0003       レモン   300  広島県
3  A0004       りんご   400
4  A0005       バナナ   500  沖縄県
5  A0006       ぶどう   600  千葉県
6  A0007       スイカ   700  熊本県
7  A0008       イチゴ   800  栃木県
8  A0009       カシス   900  不明
9  A0010       ライム  1000  不明

 
作成されたCSVファイル(CSV出力.csv)をメモ帳などのテキストエディタで開いて内容を確認してください。

プログラムソースを確認します。


272 filename = dirHome + r"\CSV出力.csv"
273 print("\nCSVファイル名:" + filename)
274 
275 # CSVファイルに出力
276 print("\n*** CSVファイルに出力  DataFrame.to_csv ***\n")
277 print(df商品一覧)
278 df商品一覧.to_csv(filename, 
279                   mode     = 'w',      # 書き込みモード
280                   index    = False,    # インデックスを出力しない
281                   encoding = 'cp932',  # 文字コード
282                   quoting  = csv.QUOTE_NONNUMERIC)  # 数値でない要素を引用符で囲む
283 
284 sys.exit()

278行目の to_csv() を使ってCSVファイルに出力します。
279行目の mode引数 に 'w' を指定することで書き込みモード(上書き)にしています。
280行目の index引数 を False にすることで、インデックス部分(0、1、2、… 、8、9)をCSVファイルに出力しないようにしています。
281行目で、encoding引数 に出力するCSVファイルの文字コードを指定しています。('cp932'、'utf-8' 等)
282行目の quoting引数 の設定は以下の通りです。
・quoting = csv.QUOTE_ALL : すべての要素が引用符で囲まれる。
・quoting = csv.QUOTE_NONNUMERIC : 数値でない要素が引用符で囲まれる。
 

<Pandas.Seriesの基礎 Pandas_DataFrameの基礎 Pandas.DataFrameの利用>
タイトルとURLをコピーしました