Итеративно загружать файлы из списка и сохранять в отдельные фреймы данных в Python - PullRequest
0 голосов
/ 27 мая 2020

Я хотел бы итеративно читать несколько файлов csv из списка в pandas и загружать их в их отдельные и соответствующие фреймы данных. Я пока не смог разобраться. Вот что у меня есть:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
file_list = [
'calendar.csv'
,'sales_train_validation.csv'
,'sample_submission.csv'
,'sell_prices.csv'
]
class Data:
    def __init__(self):
        '''init data class'''
        self.data = None

# Function to read file basename
    def file_basename_reader(file_name):
        basename = file_name.split('.')[0]
        return basename

# Function to read file extension
    def file_ext_reader(file_name):
        ext = file_name.split('.')[-1]
        return ext

# Function to load file
    def load_file(file_name):
        '''loads data from excel, csv, or txt file'''
        if Data.file_ext_reader(file_name) in ['xls','xlsx','xlsm','xlb']:
            return pd.read_excel(file_name)
        elif Data.file_ext_reader(file_name) == 'csv':
            return pd.read_csv(file_name)
        elif Data.file_ext_reader(file_name) == 'txt':
            return pd.read_table(file_name)
        else:
            raise ValueError('Invalid file format. Please check file extension to be excel, csv, or txt.')

# Function to read list of file names and iteratively create data frames
    def create_dataframe(file_list):
        global df
        global data_df
        df = ['calendar_df','sales_train_validation_df','sample_submission_df','sell_prices_df']
        for file in range(len(file_list)):
            df = Data.load_file(file_list[file])   
Data.create_dataframe(file_list)

Когда я запускал Data.create_dataframe (file_list), я надеялся получить 4 фрейма данных ('calendar_df', 'sales_train_validation_df ',' sample_submission_df ',' sell_prices_df '). Когда я читаю .head (), для этих 4 фреймов данных ничего не возвращается. Единственный возврат - для df.head (). Какое исправление следует применить к функции create_dataframe (file_list)?

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Вот предложение для более чистого кода, который возвращает список фреймов данных. Сообщите мне, работает ли это для вас.

import os

# define readers for expected extensions
excel = ['.xls','.xlsx','.xlsm','.xlb']
readers = {ext: pd.read_excel for ext in _excel}
readers.update({'.csv': pd.read_csv, '.txt': pd.read_table})

# function to apply correct reader to list of files
def read_files(file_list, readers):
    return [readers[os.path.splitext(f)[1].lower()](f) for f in file_list]

# call read_files with a file list and a readers dictionary
# ...

При необходимости эту функцию можно расширить, чтобы использовать различные дополнительные аргументы для чтения каждого файла.

0 голосов
/ 27 мая 2020

Проблема с df: вы продолжаете переопределять его, когда читаете новые фреймы данных.

Один из способов решить эту проблему: В верхней части класса определите список фреймов данных:

class Data:
    dataframes = {}

Затем в create_dataframe выполните следующие действия:

def create_dataframe(file_list):

    for file in range(len(file_list)):
        df = Data.load_file(file_list[file])   
        Data.dataframes.append(df)

Результатом будет четыре фрейма данных в Data.dataframes переменная. Если вы предпочитаете использовать воздуховод, а не список, вы, очевидно, тоже можете это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...