質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1030閲覧

フォルダ内の複数ファイルを平均化して別のフォルダに出力したい

mizumizumizu

総合スコア2

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/11/14 02:39

編集2022/11/14 07:49

前提

質問させて頂きたいです。よろしくお願い致します。

名称「Aフォルダ」内に複数のcsvファイルがあります。ファイル名は「0000583A.CSV」などです。
csvファイルは下記のような構成になっていて、一番左のTIME列が0.1秒刻みでデータを取得している時系列データとなっています。

pythonで「Aフォルダ」内のcsvファイル(例えば0000583A.CSV)を読み込み、それぞれのファイルのデータを3秒ごとに平均化して「Bフォルダ」に「0000583Ac.CSV」(末尾に小文字c追加)のようなファイル名で出力保存したいです。

コードを書いていて、いくつかのエラーが出てしまいました。
これらのエラーの発生原因と対策方法を教えて頂きたいです
①「NameError: name 'df' is not defined」
②「pandas.errors.ParserError: Error tokenizing data. C error: out of memory」
③「AttributeError: 'NoneType' object has no attribute 'resample'」

また最後のコードでCSVファイルが出力されるところまでいったのですが、「平均化したTIME列が消えてしまった」「複数のファイルを出力保存したいが1個のoutput.csvファイルしか出力保存されない」といった問題があり、対策方法を教えて頂きたいです。

このようなことを行いたい背景としては、1つ5~6メガのファイルを複数結合してBIツールで可視化分析したいのですが、pythonで実行するとファイル容量が大きすぎるのかメモリ不足が出てしまいます。
そこで0.1秒ごとのデータ取得を3秒ごとに圧縮すれば解決できるかと思いました。
最初から3秒毎でデータを取得するようにすれば良いかもしれませんが、3秒区切りでデータ分析に活用できるか不明なためデータは0.1秒で取得したいと思っています。
※5~6MBくらいのCSVファイルが週に800個ほど「Aフォルダ」に貯まっていく

文字数オーバーしてしまうのでcsvファイルの構成はコメント欄に記載します

実現したいこと

pythonで「Aフォルダ」内のcsvファイル(例えば0000583A.CSV)を読み込み、それぞれのファイルのデータを3秒ごとに平均化して「Bフォルダ」に「0000583Ac.CSV」のようなファイル名で出力保存したいです。

発生している問題・エラーメッセージ

①「NameError: name 'df' is not defined」
②「pandas.errors.ParserError: Error tokenizing data. C error: out of memory」
③「AttributeError: 'NoneType' object has no attribute 'resample'」
下記コードで①~③で変更した部分を分けて書いています

また最後のコードでCSVファイルが出力されるところまでいったのですが、「平均化したTIME列が消えてしまった」「複数のファイルを出力保存したいが1個のoutput.csvファイルしか出力保存されない」といった問題があり、対策方法を教えて頂きたいです。

該当のソースコード

python

1 2from pathlib import Path 3import pandas as pd 4 5#read_dataという名前の関数を作成する、filenameは引数であり関数の処理に渡される値 6def read_data(filename): 7 # dataという名前のリストを作成する処理を行う 8 data = [] 9 10---------------------------csv出力できた時のコード------------------------------------------ 11# fileが変数、filenameがオブジェクト、のループ処理を行う、次の読み込み処理でfileという変数にfilenameというオブジェクトの中の要素(結合したいcsvファイル名)を入れていく 12 for file in filename: 13 # 処理内容、今回はcsvファイルをpythonに読み込む、pd.read_csvでcsv形式のファイルをPandasのDataFrameへ読み取ってfile_dataという要素名に定義する、fileにはcsvファイル名が入る、headerは先頭行を3行目に指定、encodingは文字コード指定 14 df = pd.read_csv(file, encoding="cp932",skiprows=2,sep=',',index_col=0,parse_dates=True) 15 #定義された要素名file_dataをdataリストに追加 16 data.append(df) 17 #merge_dataという名前の結合されたリスト、を作るためのpd.concatという関数を行う、dataは結合する物=リストを示す、join=innerは内部結合=つのテーブルの合体可能なデータのみ取り出すことを示す 18 averaged_data = df.resample('3S').mean() 19 return averaged_data 20------------------------------------------------------------------------------------------------ 21 22-----------------csv出力できなかったとき(①~③エラーの時)のコード-------------------- 23 # fileが変数、filenameがオブジェクト、のループ処理を行う、次の読み込み処理でfileという変数にfilenameというオブジェクトの中の要素(結合したいcsvファイル名)を入れていく 24 for file in filename: 25 # 処理内容、今回はcsvファイルをpythonに読み込む、pd.read_csvでcsv形式のファイルをPandasのDataFrameへ読み取ってfile_dataという要素名に定義する、fileにはcsvファイル名が入る 26 file_data = pd.read_csv(file, encoding="cp932",skiprows=2,sep=',',index_col=0,parse_dates=True) 27 #定義された要素名file_dataをdataリストに追加 28 data.append(file_data) 29------------------------------------------------------------------------------------------------ 30 31 32------------------------------①エラーのとき-------------------------------------------------- 33 #averaged_dataという名前の平均化されたリストを作成 34 averaged_data = df.resample('3S').mean() 35 return averaged_data 36------------------------------------------------------------------------------------------------ 37 38------------------------------②エラーのとき-------------------------------------------------- 39 #averaged_dataという名前の平均化されたリストを作成 40 df = read_data(filename) 41 averaged_data = df.resample('3S').mean() 42 return averaged_data 43------------------------------------------------------------------------------------------------ 44 45------------------------------③エラーのとき-------------------------------------------------- 46 #averaged_dataという名前の平均化されたリストを作成 47 df = data.append(file_data) 48 averaged_data = df.resample('3S').mean() 49 return averaged_data 50------------------------------------------------------------------------------------------------ 51 52------------------------------csv出力できたとき---------------------------------------------- 53 #averaged_dataという名前の平均化されたリストを作成 54 df = data.append(file_data) 55 averaged_data = df.resample('3S').mean() 56 return averaged_data 57------------------------------------------------------------------------------------------------ 58 59# データの読み込み 60#Path関数を使用してファイルパスをp_Aという変数に指定 61p_A = Path("Aフォルダ") 62#glob関数を用いることでp_A = Pathのフォルダの中のcsv形式のファイル名を取得してdata_filesという名前でリスト化する 63data_files = list(p_A.glob("*.csv")) 64#上記で作成したread_data関数にdata_files引数を代入して、_input_data_Aという名前で結合したリストを作成 65_input_data_A = read_data(data_files) 66 67 68# A/B情報の書き込み 69#drop関数を用いて「Trigger」列を削除、assign関数を用いて「A」列を挿入したinput_data_Aというリストを作成 70input_data_A = _input_data_A.drop(columns='Trigger') 71 72# 平均化データの書き込み 73#to_csvでデータフレームのデータをcsvファイルに書き込む、()の中にファイルパス/ファイル名.csvで指定、now.strftime関数を用いて現在時刻をファイル名に追加 74input_data_A.to_csv("Bフォルダ/output" + ".csv", index=False, encoding="utf-8-sig") 75 76

試したこと

上記①~③と出力できた際ののエラー出た際のコード変更

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mizumizumizu

2022/11/14 02:47

csvファイルは下記のような構成です 書ききれないため1部抜粋です [LOGGING],RD81DL96_1,2,3,4 DATETIME[YYYY/MM/DD hh:mm:ss.s],INDEX,BIT[1;0],BIT[1;0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],SHORT[DEC.0],TRIGGER[*;-] TIME,INDEX,E/E,E/E_TEST,瞬時負荷_0.1% 搬出CV1,瞬時負荷_0.1% 搬出CV2,瞬時負荷_0.1% 搬出CV3,瞬時負荷_0.1% Q1Uダンパ,瞬時負荷_0.1% Q1Lダンパ,瞬時負荷_0.1% Q2Uダンパ,瞬時負荷_0.1% Q2Lダンパ,瞬時負荷_0.1% (空き),瞬時負荷_0.1% (空き),瞬時負荷_0.1% (空き),瞬時負荷_0.1% (空き),瞬時負荷_0.1% (空き),瞬時負荷_0.1% (空き),瞬時負荷_0.1% (空き),瞬時負荷_0.1% (空き),瞬時負荷_0.1% 仮想主軸,瞬時負荷_0.1% 分割ダンパ U1,瞬時負荷_0.1% 分割ダンパ U2,瞬時負荷_0.1% 分割ダンパ U3,瞬時負荷_0.1% 分割ダンパ U4,瞬時負荷_0.1% 分割ダンパ U5,瞬時負荷_0.1% 分割ダンパ U6,瞬時負荷_0.1% 分割ダンパ U7,瞬時負荷_0.1% 分割ダンパ U8,瞬時負荷_0.1% 分割ダンパ U9,瞬時負荷_0.1% 分割ダンパ U10,瞬時負荷_0.1% 分割ダンパ U11,瞬時負荷_0.1% 分割ダンパ U12,瞬時負荷_0.1% 分割ダンパ U13,瞬時負荷_0.1% 分割ダンパ U14,瞬時負荷_0.1% (空き),瞬時負荷_0.1% (空き),瞬時負荷_0.1% 分割ダンパ L1,瞬時負荷_0.1% 分割ダンパ L2,瞬時負荷_0.1% 分割ダンパ L3,瞬時負荷_0.1% 分割ダンパ L4,瞬時負荷_0.1% 分割ダンパ L5,瞬時負荷_0.1% 分割ダンパ L6,瞬時負荷_0.1% 分割ダンパ L7,瞬時負荷_0.1% 分割ダンパ L8,瞬時負荷_0.1% 分割ダンパ L9,瞬時負荷_0.1% 分割ダンパ L10,瞬時負荷_0.1% 分割ダンパ L11,瞬時負荷_0.1% 分割ダンパ L12,瞬時負荷_0.1% 分割ダンパ L13,瞬時負荷_0.1% 分割ダンパ L14,瞬時負荷_0.1% (空き),瞬時負荷_0.1% (空き),瞬時負荷_0.1% #1昇降,瞬時負荷_0.1% #2昇降,瞬時負荷_0.1% #3昇降,瞬時負荷_0.1% #4昇降,瞬時負荷_0.1% #5昇降,瞬時負荷_0.1% #6昇降,瞬時負荷_0.1% #7昇降,瞬時負荷_0.1% #8昇降,瞬時負荷_0.1% #9昇降,瞬時負荷_0.1% #10昇降,瞬時負荷_0.1% #11昇降,瞬時負荷_0.1% #12昇降,瞬時負荷_0.1% #13昇降,瞬時負荷_0.1% #14昇降,瞬時負荷_0.1% #15昇降,瞬時負荷_0.1% #16昇降,瞬時負荷_0.1% #19R昇降,瞬時負荷_0.1% #20R昇降,瞬時負荷_0.1% #21R昇降,瞬時負荷_0.1% #22R昇降,瞬時負荷_0.1% NR1R昇降,瞬時負荷_0.1% NR2R昇降,瞬時負荷_0.1% NR3R昇降,瞬時負荷_0.1% (空き),瞬時負荷_0.1% #19L昇降,瞬時負荷_0.1% #20L昇降,瞬時負荷_0.1% #21L昇降,瞬時負荷_0.1% #22L昇降,瞬時負荷_0.1% NR1L昇降,瞬時負荷_0.1% NR2L昇降,瞬時負荷_0.1% NR3L昇降,瞬時負荷_0.1% (空き),瞬時負荷_0.1% #17昇降,瞬時負荷_0.1% #18昇降,瞬時負荷_0.1% #23昇降,瞬時負荷_0.1% #24昇降,瞬時負荷_0.1% #25昇降,瞬時負荷_0.1% #26昇降,瞬時負荷_0.1% #27昇降,瞬時負荷_0.1% #28昇降,瞬時負荷_0.1% #29昇降,瞬時負荷_0.1% #30昇降,瞬時負荷_0.1% #31昇降,瞬時負荷_0.1% #32昇降,瞬時負荷_0.1% #33昇降,瞬時負荷_0.1% #34昇降,瞬時負荷_0.1% #35昇降,瞬時負荷_0.1% #36昇降,瞬時負荷_0.1% #37昇降,瞬時負荷_0.1% #38昇降,瞬時負荷_0.1% #39昇降,瞬時負荷_0.1% #40昇降,瞬時負荷_0.1% #41昇降,瞬時負荷_0.1% #42昇降,瞬時負荷_0.1% #43昇降,瞬時負荷_0.1% #44昇降,瞬時負荷_0.1% (空き),瞬時負荷_0.1% (空き),瞬時負荷_0.1% (空き),瞬時負荷_0.1% (空き),瞬時負荷_0.1% (空き),瞬時負荷_0.1% (空き),瞬時負荷_0.1% (空き),瞬時負荷_0.1% (空き),瞬時負荷_0.1% #1回転,瞬時負荷_0.1% #2回転,瞬時負荷_0.1% #3回転,瞬時負荷_0.1% #4回転,瞬時負荷_0.1% #5回転,瞬時負荷_0.1% #6回転,瞬時負荷_0.1% #7回転,瞬時負荷_0.1% #8回転,瞬時負荷_0.1% #9回転,瞬時負荷_0.1% #10回転,瞬時負荷_0.1% #11回転,瞬時負荷_0.1% #12回転,瞬時負荷_0.1% #13回転,瞬時負荷_0.1% #14回転,瞬時負荷_0.1% #15回転,瞬時負荷_0.1% #16回転,瞬時負荷_0.1% #19R回転,瞬時負荷_0.1% #20R回転,瞬時負荷_0.1% #21R回転,瞬時負荷_0.1% #22R回転,瞬時負荷_0.1% NR1R回転,瞬時負荷_0.1% NR2R回転,瞬時負荷_0.1% NR3R回転,瞬時負荷_0.1% (空き),瞬時負荷_0.1% #19L回転,瞬時負荷_0.1% #20L回転,瞬時負荷_0.1% #21L回転,瞬時負荷_0.1% #22L回転,瞬時負荷_0.1% NR1L回転,瞬時負荷_0.1% NR2L回転,瞬時負荷_0.1% NR3L回転,瞬時負荷_0.1% (空き),瞬時負荷_0.1% #17回転,瞬時負荷_0.1% #18回転,瞬時負荷_0.1% #23回転,瞬時負荷_0.1% #24回転,瞬時負荷_0.1% #25回転,瞬時負荷_0.1% #26回転,瞬時負荷_0.1% #27回転,瞬時負荷_0.1% #28回転,瞬時負荷_0.1% #29回転,瞬時負荷_0.1% #30回転,瞬時負荷_0.1% #31回転,瞬時負荷_0.1% #32回転,瞬時負荷_0.1% #33回転,瞬時負荷_0.1% #34回転,瞬時負荷_0.1% #35回転,瞬時負荷_0.1% #36回転,瞬時負荷_0.1% #37回転,瞬時負荷_0.1% #38回転,瞬時負荷_0.1% #39回転,瞬時負荷_0.1% #40回転,瞬時負荷_0.1% #41回転,瞬時負荷_0.1% #42回転,瞬時負荷_0.1% #43回転,瞬時負荷_0.1% #44回転,瞬時負荷_0.1% #23湾曲R,瞬時負荷_0.1% #24湾曲R,瞬時負荷_0.1% #25湾曲R,瞬時負荷_0.1% #26湾曲R,瞬時負荷_0.1% #27湾曲R,瞬時負荷_0.1% #28湾曲R,瞬時負荷_0.1% #29湾曲R,瞬時負荷_0.1% #30湾曲R,瞬時負荷_0.1% #31湾曲R,瞬時負荷_0.1% #32湾曲R,瞬時負荷_0.1% #33湾曲R,瞬時負荷_0.1% #34湾曲R,瞬時負荷_0.1% #23湾曲L,瞬時負荷_0.1% #24湾曲L,瞬時負荷_0.1% #25湾曲L,瞬時負荷_0.1% #26湾曲L,瞬時負荷_0.1% #27湾曲L,瞬時負荷_0.1% #28湾曲L,瞬時負荷_0.1% #29湾曲L,瞬時負荷_0.1% #30湾曲L,瞬時負荷_0.1% #31湾曲L,瞬時負荷_0.1% #32湾曲L,瞬時負荷_0.1% #33湾曲L,瞬時負荷_0.1% #34湾曲L,Trigger 2022/11/06 23:47:02.7,1550,0,0,0,0,0,17,2,39,16,0,0,0,0,0,0,0,0,0,7,4,3,3,9,6,0,2,3,7,8,0,11,3,0,0,4,5,7,11,5,4,7,0,4,1,8,13,25,4,0,0,258,302,318,361,348,373,412,358,314,333,307,330,325,331,324,344,324,352,323,328,327,320,324,0,0,0,0,0,0,0,0,0,283,409,148,483,481,577,648,718,725,771,730,684,736,660,306,416,309,340,357,324,339,386,2,486,0,0,0,0,0,0,0,0,87,35,138,59,105,78,116,100,64,49,60,58,59,58,85,82,64,72,77,105,51,55,41,0,0,0,0,0,0,0,0,0,61,87,132,117,108,80,70,12,91,65,86,53,68,42,57,28,61,45,61,34,36,63,52,45,80,17,29,35,76,58,31,34,79,33,57,3,34,1,70,3,8,13,24,14,38,42,37,50, 2022/11/06 23:47:02.8,1551,0,0,0,0,0,34,3,78,16,0,0,0,0,0,0,0,0,0,7,3,4,4,9,5,2,2,4,9,8,1,11,5,0,0,4,5,9,10,6,5,7,2,4,2,6,12,25,3,0,0,259,303,319,362,348,373,412,357,316,333,306,330,324,332,325,345,324,352,323,327,327,323,325,0,0,0,0,0,0,0,0,0,283,408,148,484,480,575,647,721,725,772,729,683,734,660,307,415,308,340,359,324,342,386,4,487,0,0,0,0,0,0,0,0,76,47,129,67,127,51,127,104,55,54,66,61,58,71,85,95,51,57,79,58,58,50,57,0,0,0,0,0,0,0,0,0,43,106,148,97,135,83,69,55,111,39,98,73,60,65,56,38,67,46,102,29,39,54,57,43,77,18,28,33,75,57,32,37,80,33,55,7,33,0,71,3,10,15,25,13,37,43,39,47, 2022/11/06 23:47:02.9,1552,0,0,0,0,0,6,2,24,17,0,0,0,0,0,0,0,0,0,6,3,4,4,10,6,1,1,4,8,8,1,11,4,0,0,3,5,8,8,6,5,6,0,3,1,8,13,26,3,0,0,258,304,319,362,349,374,414,358,315,332,307,329,323,331,325,345,323,352,324,327,328,321,324,0,0,0,0,0,0,0,0,0,285,407,146,483,480,576,646,715,726,772,730,684,734,658,305,417,310,340,357,324,340,384,4,486,0,0,0,0,0,0,0,0,66,41,130,50,106,64,111,91,62,50,50,70,47,61,89,78,69,55,97,78,47,61,54,0,0,0,0,0,0,0,0,0,59,98,122,97,123,99,85,42,120,36,103,63,57,53,50,26,74,47,60,32,47,61,69,37,77,18,30,35,77,57,31,35,78,33,57,3,33,0,67,3,8,13,25,14,35,42,42,49, 2022/11/06 23:47:03.0,1553,0,0,0,0,0,4,3,44,15,0,0,0,0,0,0,0,0,0,7,4,3,4,9,6,1,1,2,7,9,0,10,4,0,0,5,5,9,10,6,5,6,5,2,3,8,13,24,3,0,0,259,304,320,360,350,373,412,358,317,334,306,329,322,331,324,345,324,352,324,327,328,324,325,0,0,0,0,0,0,0,0,0,284,407,150,483,480,576,647,717,724,773,730,682,734,660,306,419,309,339,354,325,339,387,3,485,0,0,0,0,0,0,0,0,65,37,123,56,106,55,140,96,67,73,76,55,48,56,84,90,27,74,82,73,50,56,51,0,0,0,0,0,0,0,0,0,85,72,104,112,100,47,66,118,101,60,83,54,79,55,64,32,79,71,65,18,40,105,53,42,78,18,29,33,75,57,32,40,80,32,57,5,34,0,70,5,9,14,25,13,35,43,39,42, 2022/11/06 23:47:03.1,1554,0,0,0,0,0,81,2,62,16,0,0,0,0,0,0,0,0,0,8,3,3,4,8,5,2,0,4,9,9,0,10,3,0,0,4,5,8,9,6,5,9,1,4,2,7,15,26,3,0,0,259,305,320,360,349,373,410,358,316,334,307,331,321,331,324,345,324,351,324,327,325,320,325,0,0,0,0,0,0,0,0,0,284,410,148,485,480,576,648,716,726,772,729,685,734,657,305,416,308,339,361,323,342,387,3,488,0,0,0,0,0,0,0,0,70,43,123,65,106,63,134,77,59,69,61,71,54,47,74,72,3,90,147,67,19,69,48,0,0,0,0,0,0,0,0,0,56,89,87,83,53,64,104,79,85,80,98,59,61,62,60,19,59,44,67,35,33,66,56,44,79,18,27,36,76,58,34,34,80,34,57,4,33,0,70,3,13,15,24,14,36,47,39,50, 2022/11/06 23:47:03.2,1555,0,0,0,0,0,5,0,42,17,0,0,0,0,0,0,0,0,0,8,4,3,3,9,6,2,2,4,8,8,0,11,4,0,0,4,4,8,10,6,6,6,2,3,1,8,12,26,4,0,0,257,304,319,362,350,372,412,358,317,334,308,330,322,330,324,345,324,353,323,327,327,321,324,0,0,0,0,0,0,0,0,0,283,410,149,482,479,577,645,718,725,774,729,686,733,660,304,416,307,339,356,322,340,386,2,487,0,0,0,0,0,0,0,0,82,47,113,60,94,87,120,107,69,76,78,50,58,79,68,85,64,73,105,74,52,57,49,0,0,0,0,0,0,0,0,0,77,96,68,77,83,65,111,58,73,93,85,83,66,93,65,41,64,49,62,40,41,59,56,43,77,17,28,32,73,58,32,37,83,33,58,4,35,0,69,3,7,13,24,13,33,43,38,46,
guest

回答1

0

ベストアンサー

複数のファイルを出力保存したいが1個のoutput.csvファイルしか出力保存されない

出力するファイル名を入力ファイル名に合せて変更することになるわけですが、「うまくやってくれる」機能はありません。なので、自分で制御して作りだす必要があります。

ファイルのパスはpathlib.Path にしているようですから、この機能を使って、情報を取り出して組み立てます。

  • ファイルのディレクトリ名 (Path.parent)
  • ファイル名の拡張子を除いた部分 (Path.stem)
  • ファイル名の拡張子 (Path.suffix)

ただ、Path("Aフォルダ") で Aフォルダのパスが得られるのであれば、 Path("Bフォルダ") をディレクトリ名に使うのもありでしょう。

「Bフォルダ」に「0000583Ac.CSV」(末尾に小文字c追加)

としたいのであれば、

output_file_path = <ディレクトリ名(Bフォルダ)> / <stem> / "c" / "<拡張子>

という感じになります。


追記

だいぶ迷走してしまったので、こちらで直してみたコードです。
データが無いので動かしていませんから、バグはあると思います。
動かないとか、読んでみてわからないなどあれば質問ください。

■1つめは、 元の処理に近いもの
・ read_data関数の内容は見てみたところ、作ったリスト(data)を返していないし、最後のavaraged_dataしか返しておらず、意図不明だったので、 avaraged_dataのリストを返すように直しました。
・出力処理のところはほぼ書き直しています。read_dataがファイルのリストを受け取って結果しか返さないので、結果だけでは出力に必要なデータ(入力ファイル名)がないのでzipをつかって結合するなどしています。

python

1from pathlib import Path 2import pandas as pd 3 4 5# 複数のcsvデータを読み込んで平均化する関数 6#read_dataという名前の関数を作成する、filenameは引数であり関数の処理に渡される値 7def read_data(filename): 8 # dataという名前のリストを作成する処理を行う 9 data = [] 10 # fileが変数、filenameがオブジェクト、のループ処理を行う、次の読み込み処理でfileという変数にfilenameというオブジェクトの中の要素(結合したいcsvファイル名)を入れていく 11 for file in filename: 12 # 処理内容、今回はcsvファイルをpythonに読み込む、pd.read_csvでcsv形式のファイルをPandasのDataFrameへ読み取ってfile_dataという要素名に定義する、fileにはcsvファイル名が入る、headerは先頭行を3行目に指定、encodingは文字コード指定 13 df = pd.read_csv(file, encoding="cp932",skiprows=2,sep=',',index_col=0,parse_dates=True) 14 #averaged_dataという名前のリストを作るための関数を行う、 15 averaged_data = df.resample('3S').mean() 16 #定義された要素名file_dataをdataリストに追加 17 data.append(avaraged_data) 18 return data 19 20 21 22#パスA: 入力ファイルの格納ディレクトリ 23p_A = Path("Aフォルダ") 24 25# glob関数を用いることでp_A = Pathのフォルダの中のcsv形式の 26# ファイル名を取得してdata_filesという名前でリスト化する 27data_files = p_A.glob("*.csv") 28 29# 上記で作成したread_data関数にdata_filesを引数に指定して実行 30# 実行結果を input_data_Aに格納 31input_data_A = read_data(data_files) 32 33 34# データの書き込み 35# 出力ディレクトリ 36p_B = Path("Bフォルダ") 37 38# 計算結果のinput_data_Aにファイル名の情報が入っていないので、かなり苦しい 39# 入力ファイルのリスト(data_file)の並びと、結果ファイルの並びが同じであることを前提に処理 40for input_file_path, avaraged_data in zip(data_files, input_data_A): 41 output_file_path = p_B / (input_file_path.stem + "c.csv") 42 avaraged_data.to_csv(output_file_path, index=False, encoding='utf-8-sig')

■2つめは、この処理に合うように書き換えたもの
ファイルを読んで、平均を計算して、結果を出力するというループにしました。
また、変数名/関数名も適切と思うようなものに改めています。

python

1from pathlib import Path 2import pandas as pd 3 4# csvを読み込んで、平均を算出したdfを返す 5def make_avaraged_data(filename): 6 # csvデータを読み込む 7 df = pd.read_csv(file, encoding="cp932",skiprows=2,sep=',',index_col=0,parse_dates=True) 8 # 平均を算出 9 averaged_data = df.resample('3S').mean() 10 return avaraged_data 11 12# 入力ディレクトリ 13p_A = Path("Aフォルダ") 14# 出力ディレクトリ 15p_B = Path("Bフォルダ") 16 17# 入力ファイルのリスト 18input_files = p_A.glob("*.csv") 19 20# 全ての入力ファイルについて処理を実施 21for input_file_path in input_files 22 # データの平均を算出 23 avaraged_data = make_avaraged_data(input_file_path) 24 # データの書き込み 25 output_file_path = p_B / (input_file_path.stem + "c.csv") 26 avaraged_data.to_csv(output_file_path, index=False, encoding='utf-8-sig')

質問を受けて追記

・2つ目のコードについて、「# csvを読み込んで、平均を算出したdfを返す」の「df = pd.read_csv(」の後ろの「file」を「def make_avaraged_data(filename):」の「filename」に変えたら実行できたのですが、これは関数名の後ろの引数は関数の中の処理の変数と一致しなければならないからという認識で合っていますでしょうか?

バグですね。 すみません。

「これは関数名の後ろの引数は関数の中の処理の変数と一致しなければならないから」というより、この関数は、受けとったcsv(のファイル名)をDataframeに読み込んで、平均化し、結果のDataframeを返すものですから、read_csvには仮引数を渡さなければならないのです。

もともとのコードだとここでforループを使っていたので変数とオブジェクトで2個の文字列を作成しなければいけませんでしたが、forが無くなったので1個で良くなり、さらに言えば「filename」でも「file」でもどちらでも良い?

もともとのコードでは、引数で受け取るのはファイル名のリストですから、そのままread_csv()には渡さず、リストをループで回したときのループ変数(file)を渡していたのです。

・returnを使う意味と使い方(後ろにdataが来るかaveraged_dataが来るか)について
正直リターンを使う意味についてイマイチピンと来ていないのですが下記のサイトに書いてあるようことから

「returnを使う意味」がわからないというのがわかりません。

サイト見てみました。 説明のしかたとしてはありかもしれません。

僕なりの理解と説明をしてみます。

関数というのは、本来引数を与えて実行すると値を返してくるもの です。 なので、returnがあるのが普通です。

平方根を計算する関数は、math.sqrt()ですが、これは引数の値の平方根を返してくる関数だと思うのが普通です。
「r2 = math.sqrt(2)」とすると、r2には2の平方根(1.4142...)が入ります。このとき、math.sqrt()関数が値を返すのに必要なのがreturnです。

使い方(後ろにdataが来るかaveraged_dataが来るか)については1つ目のコードがもともと

「return averaged_data」だったところを「return data」と変更したのは、後々read_data関数を変数に代入するときに使われる値がリスト「averaged_data」ではなくリスト「data」つまりcsvファイルの数だけ追加してまとめた方だからでしょうか?

説明したように「returnの使いかた」というのと、「後ろにdataが来るかaveraged_dataが来るか」は関係がありません。
「後ろにdataが来るかaveraged_dataが来るか」はその関数の仕様として何を返すべきかの問題です。
この関数は、たぶん、「ファイルのリストを受け取って、それぞれのファイルをDataframeに読み込み、平均化して返す」のが仕様でしょう。 そして、複数のものを返すのであれば、リストで返すのが自然です。
そうすると、もとのコードには2つの問題があります。
1つは、averaged_dataを返していることです。averaged_dataは結果のリストではありません。ループの中で1つのDataframeを平均化した結果を格納したものです。 これは、ループの度に書き換えられていて、ループ終了後には、最後の1回の結果しか入っていません。 なので、返すべきはリストである「data」です。
2つめは、その返すべきリスト(data)に入っているのが、平均化前のDataframeであることです。なので、dataにappendするのは、dfではなく、avaraged_dataにしなければなりません。

・「averaged_data」という変数が「# csvを読み込んで、平均を算出したdfを返す」と「# 全ての入力ファイルについて処理を実施」の両方で使われているのですが、これは同じ変数名で2回使っているだけでどちらかを違う変数名にしても問題ないでしょうか?それとも意図的に同じ変数名なのでしょうか?上手く言い表せないのですが、同じ変数名だと二重定義みたくなってしまう気がするのですが、順番に処理されるので最初に「averaged_data」を変数を使った後に、2回目に使う時には上書きされて1回目の処理とは無関係になるから大丈夫なのでしょうか?

変数にはスコープがあります。スコープというのは有効範囲のことです。
関数は1つのスコープになっていて、仮引数と内部の変数は外のスコープに影響しません。なので、二重定義になったりはしません。
2つのavaraged_dataは別ものなので「2回目に使う時には上書きされて1回目の処理とは無関係になるから大丈夫」ということでもありません。

・1つ目のコードはエラーが出たので直したら、エラーなく実行されたのですが、出力先のフォルダに何も格納されなかったのですが理由分かりますでしょうか?
直したのは「averaged_data」が「av a raged_data」になっている部分があったので全て「averaged_data」に修正しました

それもバグですね。すみません。

理由は見ただけではわかりません。
出力先のフォルダに何も格納されていないということは、最後の出力のループがまわっていないということだと思うので、その前の段階で入るべきデータが入っていないのだと思います。
要所で変数の値をprintするなどして、どこでデータがおかしくなっているのか確認してみたいところです。

・zip関数は調べたのですが「複数のリストを関数の引数にするためのもの」という認識でよろしいでしょうか?

zipは複数のリストから順に1つずつ取って新しいリストにして順に返す関数です。
以下のコードを実行してみると動きがわかると思います。

list(zip([1, 2, 3], ['a', 'b', 'c']))

「for input_file_path, averaged_data in zip(data_files, input_data_A):」の部分はオブジェクトの「data_files」と「input_data_A」は両方とも大元は「p_A.glob("*.csv")」で持ってきたフォルダ内のcsvファイル名、forループさせるには、オブジェクト = コード内には書かれていない物(ファイル名など)を変数で定義して、その変数を後の処理で使う形にしないといけない決まりになっている、今回は「input_file_path」という変数を後ろにstemを付けて出力ファイルの名前付けに利用したい、一方で平均化したリスト(csvファイルの中に欲しい値)は「read_data関数」を「input_data変数」に定義して、forループで回すためにさらにそれを「averaged_data変数に」定義し直しているということでしょうか?
「出力ファイル名称付け」と「平均化したリストのCSV出力」をするには「2つの変数が必要」の理由がイマイチ分かっていませんが。

どうしてそのコードになったか説明するとわかるかもしれません。

まず、出力したいデータは「input_data_A」リストに入っていることはおわかりですよね。このリストには平均化したDataframeが入っています。であれば、

python

1for avaraged_data in input_data_A: 2 avaraged_data.to_csv(<出力ファイルパス>)

とすれば、結果が出力できます。
このとき、出力ファイルパスはどうすれば得られるでしょう(この質問の元ネタですね)。作るには元のcsvの名前が必要になということでしたよね。ところが、このfor分の中には、元のcsvの情報がありません。 平均化したデータには元のファイルの名前は付いていません。

どうすればいいかと考えたとき、元のcsvのリスト(data_files)を使えないかと思うわけです。そのリスト(data_files)と(input_data_A)の並びが同じです。
data_files = ['0000583A.CSV', '0000583B.CSV', ...]
input_data_A = [<0000583A.CSVを平均化したもの>, <0000583B.CSVを平均化したもの>, ...]
のような感じです。

先程のループでは、input_data_Aで回していますので、対応するdata_filesにあるファイル名が取れればいいわけです。
方法はいくつかありますが、今回は、先に出たzip関数を使いました。

zip(data_files, input_data_A) とすると、
[['0000583A.CSV', <0000583A.CSVを平均化したもの>], ['0000583B.CSV', <0000583B.CSVを平均化したもの>,]...]
というような、組み合わせのリストになって、

python

1for input_file_path, avaraged_data in zip(data_files, input_data_A):

とすると、 input_file_path と avaraged_data に順にファイル名と 平均化したデータが割り当てられてループするようになり、そのファイル名から<出力ファイルパス>を作ることができるようになるわけです。

投稿2022/11/14 05:39

編集2022/11/17 09:56
TakaiY

総合スコア12765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mizumizumizu

2022/11/14 08:40

ご回答頂きありがとうございます。 追加質問で恐縮なのですがアドバイス頂いたことを参考にして下記のように書いてみましたが data_files.stemの部分が変数扱いされずに「data_files.stemc.csv」というファイルが1つできてしまいました。 _input_data_A.to_csv("Bフォルダ/data_files.stem"+"c" + ".csv", index=False, encoding="utf-8-sig") Bフォルダ/の後ろに変数としてdata_files.stemを書く方法を教えて頂きたいです。 よろしくお願い致します。
TakaiY

2022/11/14 09:05 編集

「"Bフォルダ/data_files.stem"」これでは全て文字列になってしまうので、そうなりますね。 data_fileがpathlib.Pathのオブジェクトであれば、 Path("Bフォルダ") / data_file.stem + "c.csv" とすればいいでしょう。 ただし、質問のコードの data_files はリストですので、 data_files.stem はエラーになりますよ。
mizumizumizu

2022/11/16 06:43

TakaiY様 ご回答頂きありがとうございます。 自分で1日考えてみたのですが解決できませんでした。 下記のアドバイスを参考に >>Path("Bフォルダ") / data_file.stem + "c.csv" >>ただし、質問のコードの data_files はリストですので、 data_files.stem はエラーになりますよ。 stemはファイルのパスを入力として受け取り、それをファイルパスから抽出してファイル名を返すのでdata_files はリストなのでダメ。p_A = Path("Aフォルダ")のp_Aを.stemの前に置くことでAフォルダ内のファイル名を抽出すると思い _input_data_A.to_csv(Path("Bフォルダ)/p_A.stem+"c.csv", index=False, encoding="utf-8-sig") 上記のコードで「TypeError: unsupported operand type(s) for +: 'WindowsPath' and 'str'」が出てしまった p_A.stemの部分が変数で"c.csv"の部分が文字列なので「変数+文字列」はできないということかと思い下記に変更 _input_data_A.to_csv(Path("Bフォルダ)/str(p_A.stem)+"c.csv", index=False, encoding="utf-8-sig") しかし同じエラーが出てしまった エラーに「'WindowsPath' and 'str'」と書いているので「p_A.stem」がファイル名を取り出したことになっていなくてファイルpathなど思われているのか? 上記のようなことを考えたのですが解決策が分からず、もし可能でしたらご教示頂けると幸いです。 何卒宜しくお願い致します
TakaiY

2022/11/16 07:26

あ、僕の式が間違えていました。ごめんなさい。 Path("Bフォルダ") / data_file.stem + "c.csv" これでは左から計算されてしまい、 <Bフォルダとstemを結合したPath> + "c.csv" となってしまい、その、Path と 文字列の足し算は定義されていないというエラーになってしまいます。(Path と文字列やPathの結合は 「/」を使います 意図は、 stem と 'c.csv'を くっつけてから、 Pathと結合することだったので、()を付けなくてはなりませんでした。 Path("Bフォルダ") / (data_file.stem + "c.csv")
mizumizumizu

2022/11/16 08:01

TakaiY様 ご回答頂きありがとうございます。 頂いたアドバイスの通りやってみたところ Path("Bフォルダ") / (p_A.stem + "c.csv")と変更したらエラーは出なくなりました。 p_A = Path("Aフォルダ")です。 しかし出力されたファイルの名前が、Aフォルダのパスが「C:/D/E/F/G」だとしたら 「Gc.csv」という名前で1つだけ出力されてしまいました。 「G」に当たる部分がAフォルダの名称ですので、Aフォルダ内の複数のcsvファイルの名称ではなくフォルダ名、それも1ファイルのみの出力となってしまいました。 原因分かりますでしょうか?
TakaiY

2022/11/16 08:14

ファイル名をちゃんと組み立てなければなりません。 p_A が Path("Aフォルダ")であれば、p_A.stem がAフォルダの名前なのは当然です。 処理中のファイルの名称を使いたいのであれば、 それをpathlib.Pathオブジェクトにしたものに .stem を付けなければなりません。
mizumizumizu

2022/11/16 08:27

ご回答頂きありがとうございます。 なるほど、やってみます! ありがとうございます。
mizumizumizu

2022/11/17 01:01 編集

TakaiY様 昨日から試してみたのですが行き詰まってしまいました。 問題点をご教示頂けないでしょうか? 頂いた下記のアドバイスの部分について変更を行いました。 >>処理中のファイルの名称を使いたいのであれば、 それをpathlib.Pathオブジェクトにしたものに .stem を付けなければなりません。 Path("Bフォルダ") / (p_A.stem + "c.csv") p_A = Path("Aフォルダ")、Aフォルダのパスが「C:/D/E/F/G」では「Gc.csv」となり GはAのフォルダ名称となってしまうので p_B = Path("p_A/")を作成しました。 p_Aの後ろに「/」を付けることでAフォルダの内部を参照する=複数のcsvファイルのある階層を参照する またcsv出力もループさせないと複数ファイルを出力しないかと思い、下記のようにしました for i, file in enumerate(p_B.glob('*.csv')): _input_data_A.to_csv(Path("Bフォルダ")/(p_B.stem+"c.csv"), index=False, encoding="utf-8-sig") なので全コードで下記のように書いて実行しましたが、「Gc.csv」という名前で1つだけ出力されてしまうのが解決しませんでした。 -------------------------------------------------------------------------------------------------------------------- from pathlib import Path import pandas as pd # 複数のcsvデータを読み込んで平均化する関数 #read_dataという名前の関数を作成する、filenameは引数であり関数の処理に渡される値 def read_data(filename): # dataという名前のリストを作成する処理を行う data = [] # fileが変数、filenameがオブジェクト、のループ処理を行う、次の読み込み処理でfileという変数にfilenameというオブジェクトの中の要素(結合したいcsvファイル名)を入れていく for file in filename: # 処理内容、今回はcsvファイルをpythonに読み込む、pd.read_csvでcsv形式のファイルをPandasのDataFrameへ読み取ってfile_dataという要素名に定義する、fileにはcsvファイル名が入る、headerは先頭行を3行目に指定、encodingは文字コード指定 df = pd.read_csv(file, encoding="cp932",skiprows=2,sep=',',index_col=0,parse_dates=True) #定義された要素名file_dataをdataリストに追加 data.append(df) #averaged_dataという名前のリストを作るための関数を行う、 averaged_data = df.resample('3S').mean() return averaged_data # データの読み込み #Path関数を使用してファイルパスをp_Aという変数に指定 p_A = Path("Aフォルダ") #Aフォルダ内の複数csvファイルのパスを指定 p_B = Path("p_A/") #glob関数を用いることでp_A = Pathのフォルダの中のcsv形式のファイル名を取得してdata_filesという名前でリスト化する file_csv = p_A.glob("*.csv") data_files = list(file_csv) #上記で作成したread_data関数にdata_files引数を代入して、_input_data_Aという名前で結合したリストを作成 _input_data_A = read_data(data_files) # 結合データの書き込み #to_csvでデータフレームのデータをcsvファイルに書き込む、()の中にファイルパス/ファイル名.csvで指定 for i, file in enumerate(p_B.glob('*.csv')): _input_data_A.to_csv(Path("Bフォルダ")/(p_B.stem+"c.csv"), index=False, encoding="utf-8-sig") --------------------------------------------------------------------------------------------------------------------
TakaiY

2022/11/17 01:10

迷走しちゃってますね。 回答に追記するので、しばらくお待ちください。
mizumizumizu

2022/11/17 01:15

ありがとうございます。 何度もお手数をお掛けしてすみません。
mizumizumizu

2022/11/17 06:14

TakaiY様 コードを載せて頂きありがとうございました。 2つめのコードでやりたいことが実行できました。 何度もお答え頂いたおかげです。 大変助かりました。 本当にありがとうございました。 いくつか質問があるのですが可能でしたら後学のために教えて頂けるとありがたいです。 ・2つ目のコードについて、「# csvを読み込んで、平均を算出したdfを返す」の「df = pd.read_csv(」の後ろの「file」を「def make_avaraged_data(filename):」の「filename」に変えたら実行できたのですが、これは関数名の後ろの引数は関数の中の処理の変数と一致しなければならないからという認識で合っていますでしょうか? もともとのコードだとここでforループを使っていたので変数とオブジェクトで2個の文字列を作成しなければいけませんでしたが、forが無くなったので1個で良くなり、さらに言えば「filename」でも「file」でもどちらでも良い? ・returnを使う意味と使い方(後ろにdataが来るかaveraged_dataが来るか)について 正直リターンを使う意味についてイマイチピンと来ていないのですが下記のサイトに書いてあるようことから 今回の2つ目のコードの場合は「return averaged_data」が無いと「# 全ての入力ファイルについて処理を実施」の「averaged_data = make_averaged_data(input_file_path)」の部分で「make_averaged_data」関数の中身がnoneになってしまうので付けているのでしょうか?つまり関数を作ってただ関数名を打ち込んでその計算結果を出すだけならばreturnはいらないが、関数名を後々別の変数に代入するときにはreturnを入れておかないとエラーになってしまうのでしょうか? サイト https://pouhon.net/python-return/1776/ 使い方(後ろにdataが来るかaveraged_dataが来るか)については1つ目のコードがもともと 「return averaged_data」だったところを「return data」と変更したのは、後々read_data関数を変数に代入するときに使われる値がリスト「averaged_data」ではなくリスト「data」つまりcsvファイルの数だけ追加してまとめた方だからでしょうか? ・「averaged_data」という変数が「# csvを読み込んで、平均を算出したdfを返す」と「# 全ての入力ファイルについて処理を実施」の両方で使われているのですが、これは同じ変数名で2回使っているだけでどちらかを違う変数名にしても問題ないでしょうか?それとも意図的に同じ変数名なのでしょうか?上手く言い表せないのですが、同じ変数名だと二重定義みたくなってしまう気がするのですが、順番に処理されるので最初に「averaged_data」を変数を使った後に、2回目に使う時には上書きされて1回目の処理とは無関係になるから大丈夫なのでしょうか? ・1つ目のコードはエラーが出たので直したら、エラーなく実行されたのですが、出力先のフォルダに何も格納されなかったのですが理由分かりますでしょうか? 直したのは「averaged_data」が「av a raged_data」になっている部分があったので全て「averaged_data」に修正しました ・zip関数は調べたのですが「複数のリストを関数の引数にするためのもの」という認識でよろしいでしょうか? 「for input_file_path, averaged_data in zip(data_files, input_data_A):」の部分はオブジェクトの「data_files」と「input_data_A」は両方とも大元は「p_A.glob("*.csv")」で持ってきたフォルダ内のcsvファイル名、forループさせるには、オブジェクト = コード内には書かれていない物(ファイル名など)を変数で定義して、その変数を後の処理で使う形にしないといけない決まりになっている、今回は「input_file_path」という変数を後ろにstemを付けて出力ファイルの名前付けに利用したい、一方で平均化したリスト(csvファイルの中に欲しい値)は「read_data関数」を「input_data変数」に定義して、forループで回すためにさらにそれを「averaged_data変数に」定義し直しているということでしょうか? 「出力ファイル名称付け」と「平均化したリストのCSV出力」をするには「2つの変数が必要」の理由がイマイチ分かっていませんが。 1個目のコードではforループ2回回さなければいけなかったのが、2個目のコードでは1回で済むようになり、すっきりとしたコードで書けるということは分かりました。 かなり長文になってしまい、分かりづらい文章となってしまい申し訳ございませんが可能でしたら教えて頂けるとありがたいです。
mizumizumizu

2022/11/24 01:15

TakaiY様 ご返信が遅れてしまい大変申し訳ありませんでした。 コロナになってしまい寝込んでいました。 またご丁寧に説明をして頂きありがとうございました。 コードと説明を読み比べていくと大体の部分が理解できたように思えました。 一番しっくりきていなかったreturnについても100%理解できたわけでは無いですが 大前提として関数は「本来引数を与えて実行すると値を返してくるもの です。 なので、returnがあるのが普通です。」と頭に入れておくようにすることでreturnの使う意味など悩む必要が無くなりそうです。 この度はいろいろな質問に丁寧に答えて頂き大変助かりました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問