[python] 여러 CSV 파일을 팬더로 가져오고 하나의 DataFrame으로 연결

디렉토리에서 팬더로 여러 CSV 파일을 읽고 하나의 큰 DataFrame으로 연결하고 싶습니다. 나는 그것을 알아낼 수 없었다. 여기 내가 지금까지 가지고있는 것입니다 :

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)

for 루프 내에서 도움이 필요하십니까 ???



답변

모든 csv파일 에 동일한 열이 있으면 아래 코드를 사용해보십시오. 첫 번째 행 header=0을 읽은 후에 csv열 이름으로 지정할 수 있도록 추가했습니다 .

import pandas as pd
import glob

path = r'C:\DRO\DCL_rawdata_files' # use your path
all_files = glob.glob(path + "/*.csv")

li = []

for filename in all_files:
    df = pd.read_csv(filename, index_col=None, header=0)
    li.append(df)

frame = pd.concat(li, axis=0, ignore_index=True)


답변

darindaCoder의 답변에 대한 대안 :

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


답변

import glob, os
df = pd.concat(map(pd.read_csv, glob.glob(os.path.join('', "my_files*.csv"))))


답변

Dask 라이브러리는 여러 파일에서 데이터 프레임을 읽을 수 있습니다.

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

(출처 : http://dask.pydata.org/en/latest/examples/dataframe-csv.html )

Dask 데이터 프레임은 Pandas 데이터 프레임 API의 하위 집합을 구현합니다. 모든 데이터가 메모리에 맞는 경우 호출df.compute() 하여 데이터 프레임을 Pandas 데이터 프레임으로 변환 할 수 있습니다 .


답변

여기의 거의 모든 답변은 불필요하게 복잡하거나 (글로브 패턴 일치) 추가 타사 라이브러리에 의존합니다. Pandas와 python (모든 버전)에 이미 내장 된 모든 것을 사용하여 2 줄로이 작업을 수행 할 수 있습니다.

몇 가지 파일-1 라이너 :

df = pd.concat(map(pd.read_csv, ['data/d1.csv', 'data/d2.csv','data/d3.csv']))

많은 파일의 경우 :

from os import listdir

filepaths = [f for f in listdir("./data") if f.endswith('.csv')]
df = pd.concat(map(pd.read_csv, filepaths))

df를 설정하는이 팬더 라인은 3 가지를 사용합니다.

  1. 파이썬의 맵 (함수, 반복 가능) 은 함수 (the pd.read_csv())에게 파일 경로의 모든 csv 요소 인 반복 가능 (우리 목록)을 보냅니다
    .
  2. Panda의 read_csv () 함수는 각 CSV 파일을 정상적으로 읽습니다.
  3. Panda의 concat () 은이 모든 것을 하나의 df 변수로 가져옵니다.

답변

편집 : 나는 https://stackoverflow.com/a/21232849/186078에 갔다 . 그러나 최근에 numpy를 사용하여 조작을 수행하고 반복적으로 데이터 프레임 자체를 조작하는 대신 데이터 프레임에 한 번 할당하는 것이 더 빠르다는 사실을 알게되었습니다.이 솔루션에서도 작동하는 것 같습니다.

이 페이지를 방문하는 사람이이 접근법을 고려하기를 진심으로 원하지만이 거대한 코드를 주석으로 첨부하여 읽기 어렵게 만들고 싶지는 않습니다.

numpy를 활용하여 데이터 프레임 연결 속도를 높일 수 있습니다.

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"....]

타이밍 통계 :

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 ---


답변

재귀 적 으로 검색 하려면 ( Python 3.5 이상 ) 다음을 수행 할 수 있습니다.

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)

마지막 세 줄은 한 줄로 표현할 수 있습니다 .

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

** 여기 의 설명서를 찾을 수 있습니다 . 또한, 내가 사용하는 iglob대신 glob그것이 반환로, 반복자 대신 목록을.



편집 : 다중 플랫폼 재귀 함수 :

위의 내용을 멀티 플랫폼 기능 (Linux, Windows, Mac)으로 묶을 수 있습니다.

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

기능은 다음과 같습니다.

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)