データ分析をExcelで処理する際に,CSVやテキストファイルの読み込みが面倒だと感じたことはないでしょうか
Pythonのpandasとopenpyxlを組み合わせて使うことで,一瞬でExcelにデータを書き込むことができます
本記事では,①pandasによる複数のCSVとテキストファイルの読み込みと②pandasとopenpyxlを組み合わせたExcelへのデータの書き込みについて解説しています
マウスを使ったGUI形式で複数のファイルパスを取得する方法は,下記記事を参考にしてください
CSVファイル用の全コード
下記を実行すればファイルの選択画面が表示されます
選択した複数のCSVファイルをExcelに書き込むことができます
if name == ‘main’:の1行下のexcel_nameを変更することで保存するExcel名が変わります
import pandas as pd
from tkinter import filedialog
import openpyxl as opx
def read_filepaths() -> tuple:
typ = [('CSV', '*.csv')]
dir = r'C:'
return filedialog.askopenfilenames(filetypes=typ, initialdir=dir)
def read_csv(paths):
dfs = [pd.read_csv(path, header=0, encoding='utf-8') for path in paths]
return dfs
def write_excel(dfs, excel_name, paths):
wb = opx.Workbook()
wb.save('data/'+excel_name+'.xlsx')
with pd.ExcelWriter('data/'+excel_name+'.xlsx', engine='openpyxl', mode='a') as writer:
for df, path in zip(dfs, paths):
df.to_excel(writer, index=False, sheet_name=path.split('/')[-1].replace('.csv', ''))
if __name__ == '__main__':
# Excelファイル名
excel_name = '230429_person_info'
paths = read_filepaths()
dfs = read_csv(paths)
write_excel(dfs, excel_name, paths)
使用するCSVテキストファイルの用意
まずは,読み込むCSVかテキストファイルを用意しましょう
CSVファイルはカンマ区切り,テキストファイルはタブ区切りで用意しています
ファイル①:東日本の人情報
住所が東日本の人の名前と年齢があるデータを用意しました
名前 | 年齢 | 住所 |
---|---|---|
田中太郎 | 25 | 東京都 |
山田花子 | 32 | 千葉県 |
鈴木一郎 | 18 | 北海道 |
佐藤次郎 | 41 | 神奈川県 |
CSVファイル
名前,年齢,住所
田中太郎,25,東京都
山田花子,32,千葉県
鈴木一郎,18,北海道
佐藤次郎,41,神奈川県
テキストファイル
名前 年齢 住所
田中太郎 25 東京都
山田花子 32 千葉県
鈴木一郎 18 北海道
佐藤次郎 41 神奈川県
ファイル②:西日本の人情報
住所が西日本の人の名前と年齢があるデータを用意しました
名前 | 年齢 | 住所 |
---|---|---|
石井美加 | 29 | 大阪府 |
高橋正太郎 | 36 | 京都府 |
小林さやか | 22 | 広島県 |
田辺太郎 | 45 | 長崎県 |
CSVファイル
名前,年齢,住所
石井美加,29,大阪府
高橋正太郎,36,京都府
小林さやか,22,広島県
田辺太郎,45,長崎県
テキストファイル
名前 年齢 住所
石井美加 29 大阪府
高橋正太郎 36 京都府
小林さやか 22 広島県
田辺太郎 45 長崎県
複数のCSVとテキストファイルを読み込む
pandasでは複数のCSVやテキストファイルを高速に読み込むことができます
2つのCSVファイルを読み込む場合のコード例を下記に示します
# CSVかテキストファイルのパス
paths = ['data/230430_person_info_east.csv', 'data/230430_person_info_west.csv']
# 各ファイルをpandasのDataFrameに置き換えてリスト化
dfs = [pd.read_csv(path, header=0, encoding='utf-8') for path in paths]
# 結果出力
print(dfs)
1つのCSVかテキストファイルを読み込む
pandasでファイルを読み込む場合,read_csvかread_tableを使います
- read_csv : カンマ区切りのファイルを読み込む
- read_table : タブ区切りのファイルを読み込む
カンマ区切りのファイル
path = 'data/230430_person_info_east.csv'
df_csv = pd.read_csv(path)
print(df_csv)
タブ区切りのファイル
path = 'data/230430_person_info_east.txt'
df_txt = pd.read_table(path)
print(df_txt)
複数ファイルをリスト型で読み込む
複数ファイルは,ファイルパスをリストにして,for文で読み込みます
paths = ['data/230430_person_info_east.csv', 'data/230430_person_info_west.csv']
dfs = []
for path in paths:
dfs.append(pd.read_csv(path))
print(dfs)
空リストにappendする場合は,内包表記を使った方が速くてコードがきれいです
paths = ['data/230430_person_info_east.csv', 'data/230430_person_info_west.csv']
dfs = [pd.read_csv(path) for path in paths]
ヘッダーの行数を指定する
ヘッダーの行数を数値で指定できます
また,ヘッダーがない場合はNoneを入力します
- headerの指定なし : 1行目がヘッダー
- header=1 : 2行目がヘッダー
- header=None : ヘッダーに数値が割り当て
df_csv = pd.read_csv(path, header=1)
print(df_csv)
UnicodeDecodeErrorのエラーを解決する
UnicodeDecodeErrorなどの文字エラーが出た場合はエンコーディング方法を変えます
- utf-8 : 全言語対応.デフォルト
- shift-jis : 日本語.規格JIS X 0208の文字コード
- cp932 : shift-jisの拡張版
df_csv = pd.read_csv(path, encoding='utf-8')
print(df_csv)
データの区切り文字を変更する
データの区切り文字がカンマやタブ以外でも引数にsepを指定すると対応できます
テキストファイルをread_csvで読み込む際に,sep=’\t’とします
path = 'data/230430_person_info_east.txt'
df_txt = pd.read_csv(path, sep='\t')
print(df_txt)
Excelにデータを書き込む
前章で読み込んだデータフレームリスト(dfs)を新規のExcelファイルに書き込みます
dfsの各データフレームごとに新しいExcelシートを作成して,data_useful-python.xlsxに保存しています
excel_name = 'data_useful-python'
# Excelファイルの作成
wb = opx.Workbook()
# Excelファイルの保存
wb.save('data/'+excel_name+'.xlsx')
# pandasデータの書き込み
with pd.ExcelWriter('data/'+excel_name+'.xlsx', engine='openpyxl', mode='a') as writer:
for df, path in zip(dfs, paths):
df.to_excel(writer, index=False, sheet_name=path.split('/')[-1].replace('.csv', ''))
新規Excelファイルの作成と保存
openpyxlで新規Excelファイルを下記手順で作成します
- wb = openpyxl.Workbook() : 新規Excelのオブジェクトを作成
- wb.save(path) : ①で作成したオブジェクトをPCに保存
excel_name = 'data_useful-python'
# Excelファイルの作成
wb = opx.Workbook()
# Excelファイルの保存
wb.save('data/'+excel_name+'.xlsx')
pandasのデータフレームを書き込む
pandas.to_excelを使うことで,1行でExcelに書き込むことができます
保存先のパスを指定するだけでOKです
df.to_excel('data/'+excel_name+'.xlsx')
複数のデータフレームを書き込む
pandasで複数のデータフレームを同じExcelファイルに保存する場合は,ExcelWriterを使用します
引数のmode=aで上書き保存とします
- path : 保存先のExcelファイルのパス
- mode : w(新規)かa(上書き)のどちらか
- engine: 既存のExcelに保存する場合はopenpyxl
with pd.ExcelWriter('data/'+excel_name+'.xlsx', engine='openpyxl', mode='a') as writer:
for df in dfs:
df.to_excel(writer)
保存先のシート名を指定する
保存先のExcelシート名は,引数にsheet_nameを使用します
本記事では,CSVファイル名をシート名としました
path = 'data/230430_person_info_east.csv'
df.to_excel('data/'+excel_name+'.xlsx', sheet_name=path.split('/')[-1].replace('.csv', ''))
データフレームのインデックスを書き込まない
pandasデータフレームのインデックス(表の一番左端の列)を書き込むかどうかを指定できます
引数のindexでTrueかFalseを入力します
df.to_excel('data/'+excel_name+'.xlsx', index=False)
参考文献
pandas.read_csv
pandas.read_csv
pandas.DataFrame.to_excel
pandas.ExcelWriter
コメント