

pythonでcsvを複数ファイル（1000ファイル）読み込み、条件に応じてある列を抽出し,  
新たなcsvファイルに出力したいと考えたおります。  
file1:[id,time,value][1,3.5,6][2,2.0,4][3,2.6,8]・・・[30,15.5,50]  
fileが１個だけの時には以下のスクリプトでやりたいことができたのですが、1000個のfileでやるにはどのようにスクリプトを変更したらよいでしょうか。

[code]

    import pandas as pd
    df = pd.read_csv("list1.csv")
    df = (df[df["time"]<0.5])
    df.to_csv("list1_0.5h.csv")
    
[/code]

初歩的な内容で申し訳ございませんが、ご教授いただけましたら幸いです。  
よろしくお願いいたします。


CC BY-SA 4.0
2019-10-26T03:59:05.757
59988
2023-05-08T02:07:30.840
2020-03-15T10:40:24.867
32986
36305
question
python
pythonでcsvファイルを複数読み込み、条件に応じて列を抽出しcsvファイルとして出力したい


同一の列をもつデータフレームを結合する方法として、pd.concatが使えます。  
<https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.concat.html>

ファイル名が統一された方法で定義されていて list1.csv, list2.csv, ..., list100.csv
という名前だと仮定するなら、対応するIDをファイル名を表す文字列へ渡せば良いでしょう。これはリスト内包表記でできます。

[code]

    import pandas as pd
    df = pd.concat(
        [pd.read_csv("list{}.csv".format(i+1)) for i in range(100)])
    df = df[df["time"] < 0.5]
    df.to_csv("list1to100_0.5h.csv")
    
[/code]


CC BY-SA 4.0
2019-10-30T03:56:08.247
60109
2019-10-30T03:56:08.247
59988
answer


こちらの記事 [pandasで条件に応じてcsvから行を削除したい](https://ja.stackoverflow.com/q/60311/26370)
から同等部分をさかのぼって回答。  
もっと柔軟性を持たせるためには、コメントに紹介したコマンドラインパラメータ処理を組み込んでフォルダとかファイル名のためのパラメータを外から指定出来るようにする。

[code]

    import sys
    import os
    import pandas as pd
    
    # 対象フォルダ指定(入力/出力を別々に指定可能：ここでは両方カレントフォルダ)
    infolder = './'
    outfolder = './'
    
    # 対象ファイル名の組み立て方情報(特定文字列+数字の形式の場合)
    fprefix = 'list'       # ファイル名の頭に付いている文字列
    fsuffixFirst = 1       # ファイル名に付いている最初の数字
    fsuffixMaxPlus1 = 1001 # ファイル名に付いている最大の数字に+1したもの
    fsuffixStep  = 1       # ファイル名に付いている数字の増えていく間隔
    
    # 1000個のファイルをループ
    for fsuffix in range(fsuffixFirst, fsuffixMaxPlus1, fsuffixStep):
        basefname = fprefix + str(fsuffix)         # ファイル名だけ部分の組み立て
        inputfile = infolder + basefname + '.csv'  # パス名作成
        if os.path.exists(inputfile):     # 存在するファイルかをチェックしてから処理する
            df = pd.read_csv(inputfile)
            df = (df[df["time"]<0.5])
            df.to_csv(outfolder + basefname + '_0.5h.csv', index=False)
    
[/code]


CC BY-SA 4.0
2019-11-07T11:33:06.547
60330
2019-11-07T11:33:06.547
26370
59988
answer


他の方も指摘していますが、ここでは一個のinputファイルに一個のoutputファイルを作成するもの（例に準じています。）と考えた場合、単純にglobを使われてはどうですか？

仮に"list1.csv"と同様なcsvファイルが１０００個同じdirectory内にあると仮定した場合、  
下記のようなことでいけると思いますよ。

[code]

    import pandas as pd
    import glob
    
    FNs = glob.glob("list*.csv")
    
    for fn in FNs:
        df = pd.read_csv(fn)
        df = (df[df["time"]<0.5])
        out_fn = fn.split(".");
        df.to_csv(out_fn[0]+"_0.5h."+out_fn[1])
    
[/code]

globというのは特定のファイルを見つけてきて、それをlistに入れてくれます。


CC BY-SA 4.0
2021-05-15T21:25:12.647
75858
2021-05-15T21:25:12.647
11048
59988
answer