Импорт нескольких вложенных CSV-файлов и объединение в один DataFrame - PullRequest
0 голосов
/ 21 февраля 2019

Я пытаюсь прочитать несколько CSV-файлов, имеющих одинаковую структуру (имена столбцов) и расположенных в нескольких папках. Моя основная цель - объединить эти файлы в один фрейм данных panda.Пожалуйста, найдите прикрепленные ниже файлы расположения папок, таким образом, каждая папка содержит 5 файлов CSV.Есть ли предопределенная функция или что-то, что может помочь ??

enter image description here

enter image description here

Ответы [ 5 ]

0 голосов
/ 22 февраля 2019

Это лучшее решение этой проблемы:

import os
import glob
import pandas as pd


def nested_files_to_df(path,ext): 

    paths = []
    all_data = pd.DataFrame()

    #--- Putting all files name  in one list ---#

    for root, dirs, files in os.walk(path):
        for file in files:
            if file.endswith(tuple(ext)):
                s = os.path.join(root, file)
                paths.append(s)

    #--- Reading and merging all the  existing  excel files  into one  dataframe  ---#

    for f in paths:
        df = pd.read_excel(f)     
        all_data = all_data.append(df,ignore_index=True)

    return all_data

Вызов функции:

df= nested_files_to_df('Your main folder root',[".xls",".XLS",".xlsx"])
0 голосов
/ 21 февраля 2019

Бешеный Киви дал вам правильный ответ.Альтернативой может быть использование dask Допустим, ваша структура папок

data
├── 2016
│   ├── file01.csv
│   ├── file02.csv
│   └── file03.csv
├── 2017
│   ├── file01.csv
│   ├── file02.csv
│   └── file03.csv
└── 2018
   ├── file01.csv
   ├── file02.csv

Тогда вы можете просто прочитать все из них через

import dask.dataframe as dd
import pandas as pd

df = dd.read_csv("data/*/*.csv")
# convert to pandas via
df = df.compute()
0 голосов
/ 21 февраля 2019

Использование os.walk () и pd.concat () :

import os
import pandas as pd
outdir = [YOUR_INITIAL_PATH]
df_final = pd.DataFrame(columns=['column1', 'column2', 'columnN']) # creates an empty df with the desired structure
for root, dirs, filenames in os.walk(outdir):
    for f in filenames:
        if f.endswith('.csv'):
            df_temp = pd.read_csv(root + '\\' + f)
            df_final = pd.concat([df_final, df_temp])
0 голосов
/ 21 февраля 2019

Вы можете использовать os.walk() для перебора файлов в дереве каталогов ( пример ).pd.read_csv() будет читать один файл в информационном кадре.pd.concat(df_list) объединит все кадры данных в df_list вместе.

Я не верю, что существует один метод, который объединяет все вышеперечисленное для вашего удобства.

0 голосов
/ 21 февраля 2019

Вы можете использовать glob.glob('*.csv'), чтобы найти всех CSV, а затем объединить их всех.

import glob
import pandas as pd

csv_paths = glob.glob('*.csv')
dfs = [pd.read_csv(path) for path in csv_paths]
df = pd.concat(dfs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...