Python 複数のcsvファイルから指定した2列のデータを各々抽出して、ひとつのExcelファイルを作成する「pandas」

  '20/01/31更新:コードの汎用性を向上しました。抽出後の各列名を「抽出したファイル名_抽出した列名」とする仕様に変更。
例えば下図のように列名順が全て同じでデータ行数が異なるファイルが複数あるとする。

f:id:HK29:20191109224332p:plain

本記事では、下図のように指定2列を各々抽出して、ひとつのエクセルファイルを作成する。各列名は「抽出したファイル名_抽出した列名」となる仕様とした。

f:id:HK29:20200131184554p:plain

■本プログラム

特記事項は、PandasのSeries形式を連結してDataFrame形式へする方法が下記である。

# 5. pandas形式のDataFrame型へ合成と共に作成
DF = pd.concat((DF_x.rename(file_x_name), DF_y.rename(file_y_name)),axis=1,sort=False)

global DF としている箇所は、関数内のローカル変数でなくてグローバル変数であることを明示している。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os, sys, glob
import re
import pandas as pd
import datetime
now = datetime.datetime.now()
now = now.strftime("%y%m%d")

def append_data(n, myfile, mycolumn_name_list, myheader, mydata_startrow):
    global DF
    
    x_name, y_name = mycolumn_name_list
    file_x_name = myfile[:-4] + '_' + x_name
    file_y_name = myfile[:-4] + '_' + y_name
    
    df = pd.read_csv(myfile, header=myheader-1)
    #print("df ->" + str(df))

    # 1. 指定列をリストで取得
    x_list = df[x_name].values.tolist()
    y_list = df[y_name].values.tolist()

    # 2. 数値データ以下を再取得
    x_list = x_list[(mydata_startrow - myheader - 1):]
    y_list = y_list[(mydata_startrow - myheader - 1):]

    # 3. 1で文字列があった場合に、リストの型が文字列になるため数値型へ変換
    x_float_list = [float(s) for s in x_list]
    y_float_list = [float(s) for s in y_list]

    # 4. pandas形式のSeries型へ変換
    DF_x = pd.Series(x_float_list)
    DF_y = pd.Series(y_float_list)    
    
    if(n == 1):
        # 5. pandas形式のDataFrame型へ合成と共に作成
        DF = pd.concat((DF_x.rename(file_x_name), DF_y.rename(file_y_name)),axis=1,sort=False)
    else:
        DF[file_x_name] = DF_x
        DF[file_y_name] = DF_y
    #print(DF)

def csv2excel(myfiles, mycolumn_name_list, myheader, mydata_startrow, outfile):
    for i, myfile in enumerate(myfiles):
        print("i, myfile -> " + str(i) + ', ' + str(myfile))
        append_data(i+1, myfile, mycolumn_name_list, myheader, mydata_startrow)
    DF.to_excel(outfile, encoding='utf-8', index=False)

if __name__ == '__main__':
    ### parameter
    myfiles = glob.glob("*.csv")
    myfiles = sorted(myfiles, key=lambda x:int((re.search(r"[0-9]+", x)).group(0)))
    mycolumn_name_list = ('x', 'y')
    myheader = 1
    mydata_startrow = 3
    outfile = now + '_' + mycolumn_name_list[0] + '_' + mycolumn_name_list[1] + '.xlsx'

    ### call function
    csv2excel(myfiles, mycolumn_name_list, myheader, mydata_startrow, outfile)

本プログラムを自作モジュールとして、次のようにグラフ化まですることもできる。

hk29.hatenablog.jp

 ●本記事の参考資料

pandas.pydata.org

以上

<広告>