Chciałbym odczytać 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 ???
dfs
listy, nie chcesz zamienić liniędata = pd.read_csv(filename)
zdfs.append(pd.read_csv(filename)
. Będziesz wtedy musiał przejrzeć listę iconcat
, nie sądzę,concat
że zadziała na liściedf
s.big_frame = pd.concat(dfs, ignore_index=True)
miksujesz alias modułu z nazwą modułu, prawda ? W każdym razie, gdy będziesz mieć listę ramek danych, będziesz musiał iterować listę ibig_frame
dfs
teraz zapętlić , więc coś takiegofor df in dfs: big_frame.concat(df, ignore_index=True)
powinno działać, możesz także spróbowaćappend
zamiast tegoconcat
.concat
powinien obsługiwać listę DataFrames tak dobrze, jak ty. Myślę, że to bardzo dobre podejście.Odpowiedzi:
Jeśli masz te same kolumny we wszystkich swoich
csv
plikach, możesz wypróbować poniższy kod. Dodałemheader=0
, aby po przeczytaniucsv
pierwszego wiersza można było przypisać nazwy kolumn.źródło
df = pd.concat((pd.read_csv(f) for f in all_files))
Należy również użyćos.path.join(path, "*.csv")
zamiast niejpath + "/*.csv"
, co czyni ją niezależną od systemu operacyjnego.df['filename'] = os.path.basename(file_)
W pętli for file_. Nie jesteś pewien, czy odpowiedź Sid na to pozwala?pandas.read_csv(f).assign(filename = foo)
w generatorze.assign
zwróci całą ramkę danych, w tym nową kolumnęfilename
Alternatywa dla odpowiedzi darindaCoder :
źródło
pd.concat((pd.read_csv(f) for f in all_files), ignore_index=True)
. Wewnętrzne nawiasy klamrowe są wymagane przez Pandas w wersji 0.18.1glob.iglob
zamiastglob.glob
; Pierwszy zwraca i iterator (zamiast listy) .źródło
df = pd.concat(map(lambda file: pd.read_csv(file, delim_whitespace=True), data_files))
functools.partial
, aby uniknąćBiblioteka Dask może odczytać ramkę danych z wielu plików:
(Źródło: http://dask.pydata.org/en/latest/examples/dataframe-csv.html )
Ramki danych Dask implementują podzbiór interfejsu API ramki danych Pandas. Jeśli wszystkie dane mieszczą się w pamięci, możesz wywołać
df.compute()
konwersję ramki danych w ramkę danych Pandas.źródło
Prawie wszystkie odpowiedzi tutaj są albo niepotrzebnie złożone (dopasowanie wzorca globalnego), albo polegają na dodatkowych bibliotekach stron trzecich. Możesz to zrobić w 2 liniach, używając wszystkiego, co Pandas i python (wszystkie wersje) już mają.
Dla kilku plików - 1 wkładka:
W przypadku wielu plików:
Ta linia pand, która ustawia df, wykorzystuje 3 rzeczy:
pd.read_csv()
iterowalnej) (nasza lista), która jest każdym elementem csv w ścieżkach plików).źródło
df = pd.concat(map(pd.read_csv, glob.glob('data/*.csv))
df = pd.concat(map(pd.read_csv(header=0), glob.glob('data/*.csv))
ale dał błąd „brak parser_f () 1 wymaganego argumentu pozycyjnego: 'filepath_or_buffer'”Edycja: przeszedłem do Google na https://stackoverflow.com/a/21232849/186078 . Jednak ostatnio uważam, że szybsze jest wykonywanie jakichkolwiek operacji przy użyciu numpy, a następnie przypisywanie go raz do ramki danych zamiast manipulowania samą ramką danych w sposób iteracyjny i wydaje się, że działa również w tym rozwiązaniu.
Szczerze chcę, aby ktokolwiek odwiedzający tę stronę rozważał to podejście, ale nie chcę dołączać tego ogromnego fragmentu kodu jako komentarza i uczynić go mniej czytelnym.
Możesz użyć numpy, aby naprawdę przyspieszyć konkatenację ramki danych.
Statystyki czasu:
źródło
Jeśli chcesz wyszukiwać rekurencyjnie ( Python 3.5 lub nowszy ), możesz wykonać następujące czynności:
Zauważ, że trzy ostatnie linie mogą być wyrażone w jednym pojedynczym wierszu :
Dokumentację można znaleźć
**
tutaj . Ponadto użyłemiglob
zamiastglob
, ponieważ zwraca iterator zamiast listy.EDYCJA: Wieloplatformowa funkcja rekurencyjna:
Możesz zawinąć powyższe w funkcję wieloplatformową (Linux, Windows, Mac), dzięki czemu możesz:
Oto funkcja:
źródło
Łatwo i szybko
Zaimportuj dwa lub więcej
csv
bez konieczności tworzenia listy nazwisk.źródło
używasz jednego linera
map
, ale jeśli chcesz podać dodatkowe argumenty, możesz:Uwaga:
map
samo w sobie nie pozwala na dostarczenie dodatkowych argumentów.źródło
Jeśli wiele plików csv jest skompresowanych, możesz użyć pliku zip do odczytu wszystkich i połączenia w następujący sposób:
źródło
Kolejny on-lineer ze zrozumieniem listy, który pozwala na użycie argumentów z read_csv.
źródło
Na podstawie dobrej odpowiedzi @ Sid.
Przed konkatenacją możesz załadować pliki csv do słownika pośredniego, który daje dostęp do każdego zestawu danych na podstawie nazwy pliku (w formularzu
dict_of_df['filename.csv']
). Taki słownik może pomóc zidentyfikować problemy z heterogenicznymi formatami danych, gdy na przykład nazwy kolumn nie są wyrównane.Zaimportuj moduły i zlokalizuj ścieżki plików:
Uwaga:
OrderedDict
nie jest konieczne, ale zachowa kolejność plików, które mogą być przydatne do analizy.Załaduj pliki csv do słownika. Następnie połącz:
Klucze to nazwy plików,
f
a wartości to zawartość ramki danych plików csv. Zamiast używaćf
jako klucza słownika, możesz także użyćos.path.basename(f)
lub innych metod os.path , aby zmniejszyć rozmiar klucza w słowniku tylko do odpowiedniej, mniejszej części.źródło
Alternatywne użycie
pathlib
biblioteki (często preferowaneos.path
).Ta metoda pozwala uniknąć iteracyjnego używania pand
concat()
/apped()
.Z dokumentacji pand:
Warto zauważyć, że concat () (a zatem append ()) tworzy pełną kopię danych, a ciągłe ponowne użycie tej funkcji może spowodować znaczny spadek wydajności. Jeśli chcesz użyć operacji na kilku zestawach danych, skorzystaj ze zrozumienia listy.
źródło
W ten sposób możesz zrobić, używając Colab na Dysku Google
źródło
źródło