Saya ingin membaca beberapa file csv dari direktori menjadi panda dan menggabungkannya menjadi satu DataFrame besar. Saya belum bisa mengetahuinya. Inilah yang saya miliki sejauh ini:
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)
Saya kira saya butuh bantuan dalam for for loop ???
dfs
daftar Anda , jangan Anda ingin mengganti barisdata = pd.read_csv(filename)
dengandfs.append(pd.read_csv(filename)
. Anda kemudian perlu untuk mengulang daftar danconcat
, saya tidak berpikirconcat
akan bekerja pada daftardf
s.big_frame = pd.concat(dfs, ignore_index=True)
?, toh begitu Anda memiliki daftar kerangka data, Anda perlu mengulangi daftar itu danbig_frame
dfs
sekarang, jadi sesuatu sepertifor df in dfs: big_frame.concat(df, ignore_index=True)
harus bekerja, Anda juga bisa mencoba,append
bukanconcat
juga.concat
seharusnya menangani daftar DataFrames baik-baik saja seperti yang Anda lakukan. Saya pikir ini adalah pendekatan yang sangat bagus.Jawaban:
Jika Anda memiliki kolom yang sama di semua
csv
file Anda maka Anda dapat mencoba kode di bawah ini. Saya telah menambahkanheader=0
agar setelah membacacsv
baris pertama dapat ditetapkan sebagai nama kolom.sumber
df = pd.concat((pd.read_csv(f) for f in all_files))
Juga, salah satu mungkin harus menggunakanos.path.join(path, "*.csv")
bukanpath + "/*.csv"
, yang membuatnya OS independen.df['filename'] = os.path.basename(file_)
dalam for file_ loop .. tidak yakin apakah jawaban Sid memungkinkan ini?pandas.read_csv(f).assign(filename = foo)
di dalam generator.assign
akan mengembalikan seluruh kerangka data termasuk kolom barufilename
Alternatif jawaban darindaCoder :
sumber
pd.concat((pd.read_csv(f) for f in all_files), ignore_index=True)
. Kurung bagian dalam diperlukan oleh Pandas versi 0.18.1glob.iglob
daripadaglob.glob
; Yang pertama kembali dan iterator (bukan daftar) .sumber
df = pd.concat(map(lambda file: pd.read_csv(file, delim_whitespace=True), data_files))
functools.partial
, untuk menghindari lambdasPustaka Dask dapat membaca kerangka data dari banyak file:
(Sumber: http://dask.pydata.org/en/latest/examples/dataframe-csv.html )
Kerangka data Dask mengimplementasikan subset API kerangka data Pandas. Jika semua data masuk ke dalam memori, Anda dapat menelepon
df.compute()
untuk mengubah kerangka data menjadi kerangka data Pandas.sumber
Hampir semua jawaban di sini tidak rumit (pencocokan pola glob) atau bergantung pada pustaka pihak ke-3 tambahan. Anda dapat melakukan ini dalam 2 baris menggunakan semua Pandas dan python (semua versi) sudah ada di dalamnya.
Untuk beberapa file - 1 liner:
Untuk banyak file:
Baris panda ini yang mengatur df menggunakan 3 hal:
pd.read_csv()
) the iterable (daftar kami) yang merupakan setiap elemen csv dalam filepaths.sumber
df = pd.concat(map(pd.read_csv, glob.glob('data/*.csv))
df = pd.concat(map(pd.read_csv(header=0), glob.glob('data/*.csv))
tetapi memberikan kesalahan "parser_f () tidak ada 1 argumen posisi yang diperlukan: 'filepath_or_buffer'"Sunting: Saya googled dengan cara saya ke https://stackoverflow.com/a/21232849/186078 . Namun akhir-akhir ini saya menemukan lebih cepat untuk melakukan manipulasi menggunakan numpy dan kemudian menugaskannya sekali untuk dataframe daripada memanipulasi dataframe itu sendiri secara iteratif dan tampaknya bekerja dalam solusi ini juga.
Saya sungguh-sungguh ingin ada yang memukul halaman ini untuk mempertimbangkan pendekatan ini, tetapi tidak ingin melampirkan sepotong kode besar ini sebagai komentar dan membuatnya kurang mudah dibaca.
Anda dapat memanfaatkan numpy untuk benar-benar mempercepat rangkaian dataframe.
Statistik waktu:
sumber
Jika Anda ingin mencari secara rekursif ( Python 3.5 atau lebih tinggi ), Anda dapat melakukan hal berikut:
Perhatikan bahwa tiga baris terakhir dapat diekspresikan dalam satu baris tunggal :
Anda dapat menemukan dokumentasi di
**
sini . Juga, saya menggunakaniglob
sebagai gantinyaglob
, karena mengembalikan iterator bukan daftar.EDIT: Fungsi rekursif multiplatform:
Anda dapat membungkus di atas ke dalam fungsi multi platform (Linux, Windows, Mac), sehingga Anda dapat melakukan:
Inilah fungsinya:
sumber
Mudah dan Cepat
Impor dua atau lebih
csv
tanpa harus membuat daftar nama.sumber
satu liner menggunakan
map
, tetapi jika Anda ingin menentukan argumen tambahan, Anda bisa melakukan:Catatan:
map
dengan sendirinya tidak memungkinkan Anda memberikan argumen tambahan.sumber
Jika beberapa file csv di-zip, Anda dapat menggunakan zipfile untuk membaca semua dan menggabungkannya seperti di bawah ini:
sumber
On-liner lain dengan pemahaman daftar yang memungkinkan untuk menggunakan argumen dengan read_csv.
sumber
Berdasarkan jawaban yang baik dari @ Sid.
Sebelum digabungkan, Anda dapat memuat file csv ke kamus perantara yang memberikan akses ke setiap kumpulan data berdasarkan nama file (dalam formulir
dict_of_df['filename.csv']
). Kamus seperti itu dapat membantu Anda mengidentifikasi masalah dengan format data yang heterogen, ketika nama kolom tidak selaras misalnya.Impor modul dan temukan jalur file:
Catatan:
OrderedDict
tidak perlu, tetapi itu akan menjaga urutan file yang mungkin berguna untuk analisis.Muat file csv ke dalam kamus. Kemudian gabungkan:
Kunci adalah nama file
f
dan nilai adalah konten bingkai data dari file csv. Alih-alih menggunakanf
sebagai kunci kamus, Anda juga dapat menggunakan metode os.pathos.path.basename(f)
atau lainnya untuk mengurangi ukuran kunci dalam kamus menjadi hanya bagian yang lebih kecil yang relevan.sumber
Alternatif menggunakan
pathlib
perpustakaan (sering lebih disukaios.path
).Metode ini menghindari penggunaan berulang panda
concat()
/apped()
.Dari dokumentasi panda:
Perlu dicatat bahwa concat () (dan karenanya append ()) membuat salinan lengkap dari data, dan bahwa terus-menerus menggunakan kembali fungsi ini dapat membuat kinerja yang signifikan. Jika Anda perlu menggunakan operasi pada beberapa dataset, gunakan pemahaman daftar.
sumber
Inilah yang dapat Anda lakukan dengan menggunakan Colab di Google Drive
sumber
sumber