ここでは、Pythonにおける複数のCSVファイルの結合方法について解説しています。
行ったこと
ここでは「株式投資メモ」から任意の株価データ(10年分)をダウンロードしておき、それらのCSVファイルをまとめて結合しました。ちなみに株価データとしてはニコンになります。
実行ファイルと対象ファイルが同一階層にある場合
事前に準備すること
結合したいCSVファイルをプログラムと同一フォルダ内に入れておく必要があります。例えば、結合したいファイルが10個ある場合には、フォルダ内にはCSVファイル10個とPythonプログラムになります。
結合プログラム
#結合プログラム
import glob
import pandas as pd
#1---フォルダ内のCSVファイルの一覧を取得
files = sorted(glob.glob('*.csv'))
#2---ファイル数を取得
file_number = len(files)
#3---CSVファイルの中身を読み出して、リスト形式にまとめる
csv_list = []
for file in files:
csv_list.append(pd.read_csv(file,encoding='shift_jis',skiprows=[1]))
#4---CSVファイルの結合
merge_csv = pd.concat(csv_list)
#5---CSVファイル出力
merge_csv.to_csv('merge_nikon.csv', encoding='shift_jis')
#6---完了合図
print(file_number,' 個のCSVファイルを結合完了!!')
はじめに、1の部分で「glob()」モジュールを用いて、フォルダ内にある全てのcsvファイルを取得します。「*.csv」とすることで全てのcsvファイルの一覧を取得します。次に2の部分では結合するファイル数を取得しています。最後にメッセージを出力するときに使用しているだけなので、ここと6の部分は無くても問題ありません。
3の部分でcsvファイルをリスト型で格納しています。このとき、read_csv内で「encoding=’shift_jis’」を指定する必要があるので注意が必要です。また、結合の都合上、skiprowsを用いて1行目から取得しています。
4の部分でファイルを結合します。5の部分で「merge_nikon.csv」という名前で出力しています。おまけに6の部分で結合の終了合図としています。
【結果】
チャートのタイトル、凡例等が不足しているのは許して下さい。
指定フォルダ内およびサブディレクトリ内の指定ファイルを取得
問い合わせを頂いて、こちらも追加しておきます。内容としては、指定したパスのフォルダおよびサブディレクトリ内にあるすべてのCSVファイルを再帰的に取得し、それらのCSVファイルを読み込んで結合し、新しいCSVファイルに出力するものになります。
また、何箇所かプログラムを修正しました。
import glob
import pandas as pd
from pathlib import Path
#1---フォルダ内およびサブディレクトリ内のCSVファイルの一覧を取得
files = sorted(Path(r'C:\hoge\hoge\src').rglob('*.csv'))
#2---ファイル数を取得
file_number = len(files)
#3---CSVファイルの中身を読み出して、リスト形式にまとめる
csv_list = []
for file in files:
csv_list.append(pd.read_csv(file, encoding='shift_jis', skiprows=[1]))
if csv_list:
#4---CSVファイルの結合
merge_csv = pd.concat(csv_list)
#5---CSVファイルを出力
merge_csv.to_csv('merge_test.csv', encoding='shift_jis', index=False)
print(f"{file_number} 個のCSVファイルを結合し、merge_nikon.csv に出力しました。")
else:
print("結合するCSVファイルが存在しません。")
以下では、修正した箇所の解説になります。適宜、ご参照下さい。
#1---フォルダ内およびサブディレクトリ内のCSVファイルの一覧を取得
files = sorted(Path(r'C:\hoge\hoge\src').rglob('*.csv'))
1の部分では、従来のプログラムだと実行ファイルと取得したいファイルの一覧が別階層にある場合、実行不可能でした。そこで、「Path()」クラスを使用して、指定のフォルダとそのサブディレクトリ内のファイルを取得するように変更しました。また、「rglob()」 メソッドを使用して、再帰的にサブディレクトリ内のファイルを探索しています。
2~4はほとんど変更が無いため省略します。
#5---CSVファイルを出力
merge_csv.to_csv('merge_test.csv', encoding='shift_jis', index=False)
print(f"{file_number} 個のCSVファイルを結合し、merge_nikon.csv に出力しました。")
5の部分では、出力されるCSVファイルにインデックスを含めないようにしました。
else:
print("結合するCSVファイルが存在しません。")
また、結合するCSVファイルが存在しない場合にメッセージを表示するようにしました。
結果は省略します。
Errorが出たら
pandas.errors.ParserError: Error tokenizing data. C errorが出た場合
カラム情報が上手く取得できない場合に「pandas.errors.ParserError: Error tokenizing data. C error~」と出る場合があります。回避方法としては、カラム名を指定して書込みをして下さい。
for file in files:
col_names = ['c{0:02d}'.format(i) for i in range(15)]
csv_list.append(pd.read_csv(file,encoding='shift_jis',names = col_names))
0~15の列名を作成して、appendしています。ここでは列名を数値にしていますが、文字列でも問題ないです。
「format」の使用方法については以下を参照下さい。
>>>formatの使用方法
最後に
このプログラムは、個人的に株価の推移を様々な会社で簡単に比較できたらなと思い、作成してみました。予めデータが揃っていれば、簡単に結合できてチャート化できます。
チャート化までのプログラムを作成しました。良かったら覗いて下さい。
ちなみに、株とPythonについて勉強できる書籍があります。おすすめですので、覗いてみて下さい。
関連記事
項目 | 内容 |
「BeautifulSoup」を用いた株価のスクレイピング | 「株式投資メモ」さんの株価情報をスクレイピングし、その株価データを基にグラフ化して、excelファイルに保存する方法について解説しています。 |
「Pandas」を用いて任意のファイルから列を抽出して基礎的な統計解析する方法 | リンク先では、「【Python応用】「Pandas」を用いた複数のCSVファイルの結合からチャート化まで」を基に出力したデータを用いて基礎的な統計解析する方法について解説しています。 |
pandas-datareaderを用いた株価の取得方法 | リンク先では「pandas-datareader」を用いた株価の取得方法について解説しています。 |