2014-10-07 3 views
0

Я новичок в Python и не очень много кодера. У меня есть 40 + текстовых файлов, которые я хочу объединить (в «широком» csv, а не в «высоком» csv, то есть я не хочу добавлять файлы) и создавать новый csv.Python: слияние нескольких текстовых файлов

Использование Pandas (merge) Я могу добиться того, чего хочу, но могу предположить, что есть более простой способ. Здесь на семь файлов:


импорт панд в э.р.

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) 

Было бы замечательно, если дублированные имена столбцов (например, «ГЕОИД») не повторялись выходной файл тоже.

Любая помощь от вас очень ценится экспертами.

+0

Можете ли вы показать мне пример того, как два из этих файлов смотрите (только одну строку), и как вы хотели бы, чтобы они заканчиваются вне дома? Я не следую за вашей «высокой»/«широкой» теологией. – brunsgaard

+0

Я думаю, что это очень похоже на то, что вы хотите сделать? http://stackoverflow.com/questions/18689453/how-can-i-merge-two-csv-files-by-a-common-column-in-the-case-of-unequal-rows – Vince

ответ

2

Вы можете применить merge к списку DataFrames using reduce:

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 
Смежные вопросы