Importuj wiele plików csv do pandy i połącz w jedną ramkę danych

Chciałbym wczytać kilka plików csv z katalogu do pand i połączyć je w jedną dużą ramkę danych. Nie byłem jednak w stanie tego rozgryźć. Oto co mam do tej pory:

import glob
import pandas as pd

# get data file names
path =r'C:\DRO\DCL_rawdata_files'
filenames = glob.glob(path + "/*.csv")

dfs = []
for filename in filenames:
    dfs.append(pd.read_csv(filename))

# Concatenate all data into one DataFrame
big_frame = pd.concat(dfs, ignore_index=True)

Chyba potrzebuję pomocy w pętli for???

Author: Andy Hayden, 2014-01-03

8 answers

Jeśli masz te same kolumny we wszystkich plikach csv, możesz wypróbować poniższy kod. Dodałem header=0, aby po przeczytaniu {[1] } Pierwszy wiersz mógł być przypisany jako nazwy kolumn.

path =r'C:\DRO\DCL_rawdata_files' # use your path
allFiles = glob.glob(path + "/*.csv")
frame = pd.DataFrame()
list_ = []
for file_ in allFiles:
    df = pd.read_csv(file_,index_col=None, header=0)
    list_.append(df)
frame = pd.concat(list_)
 208
Author: Gaurav Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-23 14:13:52

Alternatywa dla odpowiedź darindacodera :

path = r'C:\DRO\DCL_rawdata_files'                     # use your path
all_files = glob.glob(os.path.join(path, "*.csv"))     # advisable to use os.path.join as this makes concatenation OS independent

df_from_each_file = (pd.read_csv(f) for f in all_files)
concatenated_df   = pd.concat(df_from_each_file, ignore_index=True)
# doesn't create a list, nor does it append to one
 168
Author: Sid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:16
import glob, os    
df = pd.concat(map(pd.read_csv, glob.glob(os.path.join('', "my_files*.csv"))))
 21
Author: Jose Antonio Martin H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-21 16:25:56

Edit: wygooglowałem sobie drogę do https://stackoverflow.com/a/21232849/186078 . Jednak ostatnio znajduję to szybciej zrobić wszelkie manipulacji za pomocą numpy, a następnie przypisanie go raz do dataframe zamiast manipulowania samym dataframe na zasadzie iteracyjnej i wydaje się działać w tym rozwiązaniu zbyt.

Szczerze chcę, aby każdy, kto wejdzie na tę stronę, rozważył to podejście, ale nie chcę dołączać tego ogromnego kawałka kodu jako komentarza i uczynić go mniej czytelnym.

Możesz wykorzystać numpy, aby naprawdę przyspieszyć konkatenację ramki danych.

import os
import glob
import pandas as pd
import numpy as np

path = "my_dir_full_path"
allFiles = glob.glob(os.path.join(path,"*.csv"))


np_array_list = []
for file_ in allFiles:
    df = pd.read_csv(file_,index_col=None, header=0)
    np_array_list.append(df.as_matrix())

comb_np_array = np.vstack(np_array_list)
big_frame = pd.DataFrame(comb_np_array)

big_frame.columns = ["col1","col2"....]

Statystyki czasu:

total files :192
avg lines per file :8492
--approach 1 without numpy -- 8.248656988143921 seconds ---
total records old :1630571
--approach 2 with numpy -- 2.289292573928833 seconds ---
 12
Author: SKG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-17 18:54:08

Biblioteka Dask może odczytać ramkę danych z wielu plików:

>>> import dask.dataframe as dd
>>> df = dd.read_csv('data*.csv')

(Źródło: http://dask.pydata.org/en/latest/examples/dataframe-csv.html )

Ramki danych Dask implementują podzbiór interfejsu API Panda dataframe. Jeśli wszystkie dane mieszczą się w pamięci, możesz wywołać df.compute() aby przekształcić ramkę danych w ramkę danych Pandy.

 7
Author: Jouni K. Seppänen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-13 08:13:39

Jeśli chcesz przeszukać rekurencyjnie (Python 3.5 lub nowszy ), możesz wykonać następujące czynności:

from glob import iglob
import pandas as pd

path = r'C:\user\your\path\**\*.csv'

all_rec = iglob(path, recursive=True)     
dataframes = (pd.read_csv(f) for f in all_rec)
big_dataframe = pd.concat(dataframes, ignore_index=True)

Zauważ, że trzy ostatnie wiersze można wyrazić w jednym pojedynczym wierszu :

df = pd.concat((pd.read_csv(f) for f in iglob(path, recursive=True)), ignore_index=True)

Można znaleźć dokumentację ** tutaj . Ponadto, użyłem iglob zamiast glob, ponieważ zwraca iterator zamiast listy.



EDIT: Multiplatform recursive function:

Możesz zawinąć powyższe w funkcja wieloplatformowa (Linux, Windows, Mac) , więc możesz to zrobić:

df = read_df_rec('C:\user\your\path', *.csv)

Oto funkcja:

from glob import iglob
from os.path import join
import pandas as pd

def read_df_rec(path, fn_regex=r'*.csv'):
    return pd.concat((pd.read_csv(f) for f in iglob(
        join(path, '**', fn_regex), recursive=True)), ignore_index=True)
 6
Author: toto_tico,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-09 19:36:50

Jeśli wiele plików csv jest spakowanych, możesz użyć zipfile, aby odczytać wszystkie i połączyć jak poniżej:

import zipfile
import numpy as np
import pandas as pd

ziptrain = zipfile.ZipFile('yourpath/yourfile.zip')

train=[]

for f in range(0,len(ziptrain.namelist())):
    if (f == 0):
        train = pd.read_csv(ziptrain.open(ziptrain.namelist()[f]))
    else:
        my_df = pd.read_csv(ziptrain.open(ziptrain.namelist()[f]))
        train = (pd.DataFrame(np.concatenate((train,my_df),axis=0), 
                          columns=list(my_df.columns.values)))
 3
Author: Nim J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-16 14:06:04
filepaths = ['data/d1.csv', 'data/d2.csv','data/d3.csv','data/d4.csv']
df = pd.concat(map(pd.read_csv, filepaths))
 2
Author: robmsmt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-30 21:23:25