Запись в CSV-файл - Python 3.7 - PullRequest
0 голосов
/ 04 июля 2019

введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь Я получил несколько CSV-файлов.Имена файлов представлены в виде filename1.in.csv и filename1.out.csv, filename2.in.csv и filename2.out.csv.Эти файлы находятся в папках и подпапках.Я пытаюсь рассчитать некоторые статистические значения файлов .in.csv отдельно и файлов .out.csv отдельно.Но в конце все это нужно записать в один CSV-файл (известный как OutputFile в моем коде) построчно с заголовками.Каждая строка получает имя входного файла в виде className вместе с вычисленными значениями.Я приложил изображение CSV-файла, который я принимаю в качестве входных данных (inFile) для расчета статистических значений.Я не получаю желаемый результат.дает NameError: maxTimeIn, minTimeIn, stdTimeIn, qual1TimeIn, qual2TimeIn, maxLenIn, minLenIn, stdLenIn, qual1LenIn, qua12LenIn, maxTimeOut, minTimeOut, stdTimeOut, qual1TimeOut, qual2TimeOut, maxLenOut, minLenOut, stdLenOut, qual1LenOut, qua12LenOut, className not defined.Я новичок в Python, поэтому я не уверен, выдаст ли мой код вывод, как требуется, любая помощь очень ценится.Спасибо

import os
import pandas as pd
import csv

startdir= '.'
suffix= '.csv'
for root,dirs, files, in os.walk(startdir):
    for name in files:
        if not name.endswith(suffix):
            continue
        inFile = os.path.join(root,name)

        data = pd.read_csv(inFile)

        base = os.path.basename(inFile)
        className = os.path.splitext(base)[0]

        if inFile.endswith('.in.csv'):

            maxTimeIn = data['frame.time_delta_displayed'].max()
            minTimeIn = data['frame.time_delta_displayed'].min()
            stdTimeIn = data['frame.time_delta_displayed'].std()
            qual1TimeIn = data['frame.time_delta_displayed'].quantile(0.25)
            qual2TimeIn = data['frame.time_delta_displayed'].quantile(0.5)

            maxLenIn = data['frame.len'].max()
            minLenIn = data['frame.len'].min()
            stdLenIn = data['frame.len'].std()
            qual1LenIn = data['frame.len'].quantile(0.25)
            qua12LenIn = data['frame.len'].quantile(0.5)

        if inFile.endswith('.out.csv'):

            maxTimeOut = data['frame.time_delta_displayed'].max()
            minTimeOut = data['frame.time_delta_displayed'].min()
            stdTimeOut = data['frame.time_delta_displayed'].std()
            qual1TimeOut = data['frame.time_delta_displayed'].quantile(0.25)
            qual2TimeOut = data['frame.time_delta_displayed'].quantile(0.5)

            maxLenOut = data['frame.len'].max()
            minLenOut = data['frame.len'].min()
            stdLenOut = data['frame.len'].std()
            qual1LenOut = data['frame.len'].quantile(0.25)
            qua12LenOut = data['frame.len'].quantile(0.5)

            csvData = [['maxTimeIn', 'minTimeIn', 'stdTimeIn', 'q1TimeIn', 'q2TimeIn', 'maxLenIn', 'minLenIn', 'stdLenIn', 'q1LenIn', 'q2LenIn', 'maxTimeOut', 'minTimeOut', 'stdTimeOut', 'q1TimeOut', 'q2TimeOut', 'maxLenOut', 'minLenOut', 'stdLenOut', 'q1LenOut', 'q2LenOut','activity'],
                       [maxTimeIn, minTimeIn, stdTimeIn, qual1TimeIn, qual2TimeIn, maxLenIn, minLenIn, stdLenIn, qual1LenIn, qua12LenIn, maxTimeOut, minTimeOut, stdTimeOut, qual1TimeOut, qual2TimeOut, maxLenOut, minLenOut, stdLenOut, qual1LenOut, qua12LenOut, className]]

        with open('/root/Desktop/OutputFile.csv','w') as csvFile:
            writer = csv.writer(csvFile)
            writer.writerows(csvData)

        csvFile.close()

1 Ответ

0 голосов
/ 04 июля 2019

Попробуйте этот код, где я использовал pathlib вместо os.path и рефакторированные функции для использования методов Pandas:

from pathlib import Path
import pandas as pd


def prepare_values(df):
    df_columns = ['frame.time_delta_displayed', 'frame.len']
    df_values = []
    for col in df_columns:
        df_values += [
            df[col].max(),
            df[col].min(),
            df[col].std(),
            df[col].quantile(0.25),
            df[col].quantile(0.5),
        ]
    return df_values


source_dir = Path('stat')

in_data = []
for file in source_dir.glob('**/*.in.csv'):
    activity = {'activity': file.stem.split('.')[0]}
    df = pd.read_csv(file)
    cols = ['maxTimeIn', 'minTimeIn', 'stdTimeIn', 'q1TimeIn', 'q2TimeIn',
            'maxLenIn', 'minLenIn', 'stdLenIn', 'q1LenIn', 'q2LenIn']
    values = prepare_values(df)
    file_data = {**activity, **dict(zip(cols, values))}
    in_data.append(file_data)

out_data = []
for file in source_dir.glob('**/*.out.csv'):
    activity = {'activity': file.stem.split('.')[0]}
    df = pd.read_csv(file)
    cols = ['maxTimeOut', 'minTimeOut', 'stdTimeOut', 'q1TimeOut', 'q2TimeOut',
            'maxLenOut', 'minLenOut', 'stdLenOut', 'q1LenOut', 'q2LenOut']
    values = prepare_values(df)
    file_data = {**activity, **dict(zip(cols, values))}
    out_data.append(file_data)

in_df = pd.DataFrame(in_data)
out_df = pd.DataFrame(out_data)
all_df = in_df.join(out_df.set_index('activity'), on='activity', how='outer')

all_df.dropna(subset=df_all.columns.tolist()[1:], how='all', inplace=True)
all_df.fillna(0, inplace=True)
all_df.to_csv('all_data.csv', index=False)
...