2014-10-07 2 views
0

저는 파이썬에 익숙하지 않고 많은 코더를 사용하지 않습니다. 나는 함께 결합하고자하는 40 개 이상의 텍스트 파일을 가지고 있는데 ('와이드'CSV, 'CSV'와 반대), 파일을 추가하고 싶지 않고 새로운 CSV 파일을 생성합니다.Python : 여러 텍스트 파일 병합

팬더 (병합)를 사용하면 원하는 것을 얻을 수 있지만 더 간단한 방법이 있다고 생각합니다. 여기에는 파일의 일곱에 : PD로


수입 팬더

a = pd.read_csv("c:/pyTest/B01001.txt") 
b = pd.read_csv("c:/pyTest/B01002.txt") 
c = pd.read_csv("c:/pyTest/B01003.txt") 
d = pd.read_csv("c:/pyTest/B02001.txt") 
e = pd.read_csv("c:/pyTest/B05001.txt") 
f = pd.read_csv("c:/pyTest/B05002.txt") 
g = pd.read_csv("c:/pyTest/B05012.txt") 

merged = a.merge(b.merge(c.merge(d.merge(e.merge(f.merge(g, on='GEOID'), on='GEOID'), on='GEOID'), on='GEOID'), on='GEOID'), on='GEOID') 
merged.to_csv("c:/pytest/fook.csv", index=False) 

중복 된 열 이름 (예를 들어 'GEOID')에서 반복되지 않은 경우 그것은 좋은 것입니다 출력 파일도.

전문가의 도움을 받아 주시면 감사하겠습니다.

+0

당신이 나에게 파일의 두 (단지 하나의 행을) 보는 방법의 예를 보여줄 수 당신이 그들을 밖으로 종료 할 방법 : 예를 들어


? 나는 너의 '키가 크고'/ '넓은'현상을 따른다. – brunsgaard

+0

나는 이것이 당신이하고 싶은 것과 매우 유사하다고 생각하니? http://stackoverflow.com/questions/18689453/how-can-i-merge-two-csv-files-by-a-common-column-in-the-case-of-unequalrows – Vince

답변

2

당신은 DataFrames using reduce 목록에 merge을 적용 할 수

import pandas as pd 
import functools 

files = ["c:/pyTest/B01001.txt", "c:/pyTest/B01002.txt", "c:/pyTest/B01003.txt", 
     "c:/pyTest/B02001.txt", "c:/pyTest/B05001.txt", "c:/pyTest/B05002.txt", 
     "c:/pyTest/B05012.txt",] 
dfs = [pd.read_csv(filename).set_index('GEOID') for filename in files] 
mergefunc = functools.partial(pd.merge, left_index=True, right_index=True) 
merged = functools.reduce(mergefunc, dfs) 

merged.to_csv("c:/pytest/fook.csv", index=False) 

팬더가 (오히려 열보다)에 인덱스에 따라 두 DataFrames을 병합 결과 DataFrame 병합 된 인덱스를 사용합니다. 따라서 색인에 병합하여 GEOID 열의 중복을 피할 수 있습니다.

In [99]: import numpy as np 
In [100]: import pandas as pd 
In [101]: import functools 

In [102]: dfs = [pd.DataFrame(np.arange(6).reshape(3,2), columns=['A','B{}'.format(i)]).set_index('A') for i in range(3)] 

In [103]: mergefunc = functools.partial(pd.merge, left_index=True, right_index=True)  
In [104]: merged = functools.reduce(mergefunc, dfs) 

In [105]: merged 
Out[105]: 
    B0 B1 B2 
A    
0 1 1 1 
2 3 3 3 
4 5 5 5