PandasのDataFrameを扱う方法を、演習用プログラムのソースコードを使い、それを実行しながら解説します。
1.演習用プログラムのダウンロード
演習用プログラム( practice19.py )、Excelファイル( 商品一覧.xlsx )、CSVファイル( 追加商品.csv )をダウンロードします。
演習用プログラムは テキストファイルになっているので、エクスプローラーを使って拡張子を .txt から .py に変更します。
practice19.py、商品一覧.xlsx、追加商品.csv を Python をインストールしたフォルダ(今回は C:\Python)に置きます。
2.ソースコードの表示
メモ帳を使って、演習用プログラム( 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の利用> |


