見出し画像

【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


興味があること #育児 #料理 #ものづくり 楽しんで学んでいきたいです。 皆さんの【楽しんでいること】も是非、教えてください。