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

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

■本プログラム
特記事項は、PandasのSeries形式を連結してDataFrame形式へする方法が下記である。
DF = pd.concat((DF_x.rename(file_x_name), DF_y.rename(file_y_name)),axis=1,sort=False)
global DF としている箇所は、関数内のローカル変数でなくてグローバル変数であることを明示している。
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)
x_list = df[x_name].values.tolist()
y_list = df[y_name].values.tolist()
x_list = x_list[(mydata_startrow - myheader - 1):]
y_list = y_list[(mydata_startrow - myheader - 1):]
x_float_list = [float(s) for s in x_list]
y_float_list = [float(s) for s in y_list]
DF_x = pd.Series(x_float_list)
DF_y = pd.Series(y_float_list)
if(n == 1):
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
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__':
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'
csv2excel(myfiles, mycolumn_name_list, myheader, mydata_startrow, outfile)
本プログラムを自作モジュールとして、次のようにグラフ化まですることもできる。
hk29.hatenablog.jp
●本記事の参考資料
pandas.pydata.org
以上
<広告>
リンク