Как открыть CSV файлы из папки и применить к ним for?

Задача - открыть все CSV файлы в папке и применить к ним for.

Код внизу не работает. На выходе должен получиться большой список print из всех CSV лежащих в папке data.

import pandas as pd
from pathlib import Path

def fun(filename):

    df = [fun(f) for f in Path("/data/").glob("*.csv")]
    df.columns = ['Date', 'Time', 'Close']

    close_l = list(df['Close'].values)

    for i in range(df):
        close = close_l[i]

        if close > 26:
             print(close *10)   

Результат:

Date, Time, Close

файл 1

2020.06.01 190016 22
2020.06.01 190017 30
2020.06.01 190018 30

файл 2

2020.06.01 190016 28
2020.06.01 190017 28
2020.06.01 190018 24

файл 3

2020.06.01 190016 29
2020.06.01 190017 22
2020.06.01 190018 29

Результат вывода:

300
300
...
280
280
...
290
290

это 3 файла, где в столбце df['Close'] были значения больше 26. На выходе после умножения на 10 каждой строки вышел такой пример.


Пример файла.


Ответы (2 шт):

Автор решения: MaxU
def fun(
        filename,
        names=["Date", "Time", "Close"],
        col="Close",
        threshold=26,
        mult_factor=10,
        **args):
    res = (pd.read_csv(filename, header=None, names=names, **args)
             .query(f"{col} > @threshold")
             [col] * mult_factor)
    return res
    
res = pd.concat([fun(f, threshold=26, mult_factor=10, delim_whitespace=True)
                 for f in Path(r"C:\temp\data").glob("*.csv")],
                ignore_index=True)

результат:

In [263]: res
Out[263]:
0    300
1    300
2    280
3    280
4    290
5    290
Name: Close, dtype: int64

In [264]: res.to_list()
Out[264]: [300, 300, 280, 280, 290, 290]

In [265]: res.to_list()
Out[265]: [300, 300, 280, 280, 290, 290]
→ Ссылка
Автор решения: MaxU

Пример медленной (невекторизированной) функции, которая будет итерироваться по строкам каждого CSV файла и печатать на экран:

def fun(filename, **kwargs):
    df = pd.read_csv(
        filename, header=None, names=["Date", "Time", "Close"], **kwargs)
    for idx, row in df.iterrows():
        if row["Close"] > 26:
            print(row["Close"] *10)

_ = [fun(f, delim_whitespace=True) for f in Path(r"C:\temp\data").glob("*.csv")]

вывод:

300
300
280
280
290
290
→ Ссылка