
【python】csv,excelの取り込み、加工、出力まとめ①
csvやエクセルの整理をpandasで行うときに使うコマンドまとめ。取り込みと出力。
csvファイルを探す
pythonスクリプトと同じディレクトリにあるcsvを探す
例えば、pythonスクリプトと同じディレクトリにあるcsvを探して処理を行う。
import glob
import os
base_path = os.path.dirname(__file__)
files = glob.glob(os.path.join(base_path,"*.csv"))
for file in files:
処理
glob.glob()の戻り値はファイルパス(str)のリスト。オブジェクトの型はtype()で確認できる。
>>> print(type(files))
<class 'list'>
>>> print(type(files[0]))
<class 'str'>
再帰探査をする
パスに"**"を含めたうえで、引数にrecursive=True"を追加する。デフォルトは"recursive=False"。
files = glob.glob(os.path.join(base_path,"**","*.csv"), recursive=True)
ファイルをDataFrameに取り込む
read_csvを利用する
csvをDataFrameとして読み込むことができるread_csv()を利用。とても強力な機能で52個のパラメータを持つことができる。
例えば、取引明細などを読み込むときは以下のようなパラメータ指定を行う。
import pandas as pd
df_tmp = pd.read_csv(r"C:\money.csv", \
encoding="utf-8", \
header=None, \
skiprows=1, \
skipfooter=0, \
usecols=[0,1,2,6], \
names=["日付", "明細", "補足", "支出"], \
engine="python", \
thousands=',')
パラメータの意味は以下の通り。pythonコードは"\"で改行できる。
encoding="utf-8"
文字列のencodingを指定する。デフォルトは"utf-8"。"shift-jis"のcsvファイルも多い。header=None
DataFrameのColumnsになる列名が記載された行を指定する。デフォルトは"0"(1行目)。余程フォーマットが決まっているものでない限り、header=Noneを指定して、後述のusecolsとnamesを指定したほうが処理しやすい。skiprows=1
ファイルの先頭から指定した行数分スキップして読み込む。デフォルトは"0"(スキップしない)。口座番号や契約氏名など余計な情報がついていることも多い。skipfooter=0
ファイルの末尾から指定した行数分スキップして読み込む。usecols=[0,1,2,6],
利用する列をリストで指定する。このパラメーターを明示的に指定すると、解析時間が大幅に短縮され、メモリ使用量が少なくなる。names=["日付", "明細", "補足", "支出"]
DataFrameで使用する列名をリストで指定する。usecolsと合わせて、0,1,2,6行目を"日付", "明細", "補足", "支出"列として読み込む。engine="python"
利用するparserを指定する。encodingを指定する場合、parserがcで動くのでうまくいかない場合がある。thousands=','
1,000のセパレータを指定する。指定しないとobject型になるためint型を期待した前処理が難しくなる。
DataFrameの列ごとの型はdtypesで確認できる。dtypes自体の戻り値はSiries。
>>> print(df_tmp.dtypes)
日付 object
明細 object
補足 object
支出 int64
dtype: object
>>> print(type(df_tmp.dtypes))
<class 'pandas.core.series.Series'>
read_excelを利用する
read_excel()で、エクセルファイルの読み込みも可能。xlrdとopenpyxlのライブラリが必要。
pip install xlrd openpyxl
read_csv()と比べるとencoding以外のパラメータはおおよそ指定できる。エクセル特有のパラメータとして、読み込むシートを指定するsheet_nameが存在する。デフォルトは"0"で1つ目のシートを読み込む。"sheet1"などのstr型の指定や"None"で全シート読み込むことの指定ができる。
import pandas as pd
df_tmp = pd.read_excel(r"C:\money.xlsx", \
sheet_name=0, \
header=None, \
skiprows=1, \
skipfooter=0, \
usecols=[0,1,2,6], \
names=["日付", "明細", "補足", "支出"], \
thousands=',')
DataFrameをファイル出力する
例えば以下のようなDataFrameを出力する。
import pandas as pd
df1 = pd.DataFrame(
data = {"取引": list(range(5)),
"詳細": ["ぶどう購入", "だいこん購入", "何もしなかった", "りんご購入", "手伝いした"],
"収入": [None,None,None,None,1000],
"支出": [100,200,None,800,None],
"残高": [900,700,None,-100,900]}
)
>>> print(df1)
取引 詳細 収入 支出 残高
0 0 ぶどう購入 NaN 100.0 900.0
1 1 だいこん購入 NaN 200.0 700.0
2 2 何もしなかった NaN NaN NaN
3 3 りんご購入 NaN 800.0 -100.0
4 4 手伝いした 1000.0 NaN 900.0
to_csv()を利用してスクリプトファイルがあるところにdf1.csvとして出力する。
import os
base_path = os.path.dirname(__file__)
filename = "df1.csv"
df1.to_csv(os.path.join(base_path,filename), mode="a", encoding='utf_8_sig')
最初の引数に出力先のパス。新規、上書きなどを"mode"で指定する。デフォルトは"w"(既存であれば上書き、存在しない場合は新規作成)。"a"はファイル末尾に追記。"encoding"では文字コードを指定する。excelでcsvを開くにはbom付きであることが必要。その場合"utf_8_sig"とする。初回実行時は以下のようなdf1.csvが作成される。
,取引,詳細,収入,支出,残高
0,0,ぶどう購入,,100.0,900.0
1,1,だいこん購入,,200.0,700.0
2,2,何もしなかった,,,
3,3,りんご購入,,800.0,-100.0
4,4,手伝いした,1000.0,,900.0
いいなと思ったら応援しよう!
