

Pythonのpandasでcsvを読み込み、条件に従って行を削除し、新たなファイルに出力したいと考えています。

csvファイル (list1.csv)
が以下の時、『time2』に着目し、time2が1.0以下のものの中からtime2の値が小さい順に3つ削除する為には、以下のスクリプトで実行できるかと思います。

**list1.csv**

[code]

    [time1,time2][0.27,0.45][0.28,0.53][0.3309,0.65987][0.36938,0.8952][0.4396,1.0847]...
    
[/code]

といったようにすでにtime2の値はソート済みです。

**スクリプト**

[code]

    import pandas as pd
    df = pd.read_csv("list1.csv")
    df_a = (df[df['time2'] < 1.0])
    print(df_a)
    df_b = df_a.drop([0,1,2])
    print(df_b)
    
[/code]

* * *

ここでお聞きしたいのは、csvファイルを読み込み、time2に着目するのは同じですが、

  * time2が `0以上0.5未満` の値の行を削除し、それ以外を別ファイル (list1_0.5h.csv) として出力
  * 同様にtime2が `0.5以上1.0未満` の値の行を削除し、それ以外を別ファイル (list1_1.0h) として出力

といったように、time2が `5.5以上6.0未満` まで同じことを繰り返すにはどのようにしたらよいでしょうか。  
time2には0未満の値はありませんが6.0以上の値は存在します。

また、time2の値によって行を削除していく中で削除できる行数が5行と制限を加え、削除した行が5行に到達した場合には、それ以降は行を削除することなく、ファイル名を上記のように変更するにはどのようにしたらよいでしょうか。  
新たなファイル名は元のファイル名に削除範囲の上の時間帯を加えたものになります。

上記内容を複数ファイル（list1.csv～list1000.csv)で同様の内容をやりたいと思ています。

初歩的な内容で大変恐縮ではありますが、ご教授いただけましたら幸いです。  
よろしくお願いいたします。


CC BY-SA 4.0
2019-11-07T04:55:03.753
60311
2019-11-07T11:34:47.163
2019-11-07T08:02:48.680
36305
36305
question
python pandas
pandasで条件に応じてcsvから行を削除したい


**回答部分**  
@metropolis さんの処理を使わせてもらって、ファイル数を拡張する処理を追加しました。  
もっと柔軟性を持たせるためには、前の質問のコメントに紹介したコマンドラインパラメータ処理を組み込んでフォルダとかファイル名のためのパラメータを外から指定出来るようにしてください。

ちなみに、質問のcsvデータ例の
4つ目のデータ`0.36938,0.8952`が`0.36938000000000004,0.8952`となりましたが、`pandas`での変換時の誤差でしょう。必要ならば別途対策してください。

[code]

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

* * *

**事前確認部分**  
回答では無いですが、確認事項が複数あって、コメントでは綺麗にならないので。  
この辺の内容を確認・追記してください。

  * 説明文では`time2`ですが、ソースでは`time1`です。どちらでしょう？
  * ある時間範囲が削除されたデータを作りたいのは本当ですか？ 逆にその範囲を抽出する方がよく使われそうですが。
  * 元のデータに`0`未満や`6.0`以上の値は存在しますか？
  * 新たに作るファイルの名前は、「元のファイル名」に削除範囲の後ろの区切りの名前を加えたものということで良いですか？
  * `df_a`のように単純に範囲抽出しただけでは小さい順にソートされないと思うのですが、元のデータがソート済みですか？
  * 以前の質問のこちら [python csv 複数ファイル読み込み 書き換え 出力](https://ja.stackoverflow.com/q/59988/26370) の処理とは関係ありますか？ 関係ある場合、組み合わせる考慮は必要ですか？


CC BY-SA 4.0
2019-11-07T06:23:35.840
60316
2019-11-07T11:34:47.163
2019-11-07T11:34:47.163
26370
26370
60311
answer


一例として。

[code]

    import pandas as pd
    import numpy as np
    
    df = pd.read_csv('list1.csv')
    
    start, end, tick = 0.0, 6.0, 0.5
    remove_max = 5
    for s in np.arange(start, end, tick):
      df.drop(df[(df.time2 >= s) & (df.time2 < (s+tick))].index[:remove_max])\
        .to_csv('list1_' + str(s+tick) + 'h.csv', index=False)
    
[/code]


CC BY-SA 4.0
2019-11-07T09:31:16.363
60325
2019-11-07T09:31:16.363
60311
answer