2017-02-03 5 views
1

Я разбираю много сотен файлов .tsv из разных каталогов. Каждый файл имеет только 2 столбца, и идея состоит в том, чтобы использовать индекс в одном столбце для конкатенации позже.Разбор нескольких .tsv с помощью Pandas - эффективная индексация и разбор?

df1=pd.DataFrame({ 'A':['name1.0', 'name2.0', 'name3.0'], 'B':[4., 3., 2.]}) 
df2=pd.DataFrame({ 'A':['name1.0', 'name3.0', 'name4.0', 'name5.3'], 'B':[3., 4., 5., 0.]}) 

проблемы:

  1. Колонна служить индекс должен быть обработан;
  2. Файлы могут иметь различное количество строк.

Что такое эффективный способ сделать это в python/pandas?

Использование df1 и df2 выше, идея состоит в том, чтобы объединить данные на основе преобразованных индексов. Например:

df1.index=[re.sub('\..+$','',i) for i in df1.loc[:,'A']] 
df2.index=[re.sub('\..+$','',i) for i in df2.loc[:,'A']] 
out=pd.concat([df1.loc[:,'B'],df2.loc[:,'B']],axis=1) 
out 

Есть ли более эффективный способ сделать это? Заранее благодарю вас

ответ

1

Вот один из способов, которые позволяют загружать каждый сразу и сделать ось = 0 CONCAT:

Загрузите файлы с дополнительной колонкой я назвал fileid в этом Exemple, которые позволяют идентифицировать строки исходящих из заданного файла. Вы должны быть в состоянии сделать это в вашей загрузки петли

df1 
Out[189]: 
     A B fileid 
0 name1.0 4.0  1 
1 name2.0 3.0  1 
2 name3.0 2.0  1 

df2 
Out[190]: 
     A B fileid 
0 name1.0 3.0  2 
1 name3.0 4.0  2 
2 name4.0 5.0  2 
3 name5.3 0.0  2 

сделать один раз очистить от вашей колонки A:

df = pd.concat([df1, df2]) 

df.A = df.A.str.split('.', n=1, expand=True)[0] 

df 
Out[183]: 
     A B fileid 
0 name1 4.0  1 
1 name2 3.0  1 
2 name3 2.0  1 
0 name1 3.0  2 
1 name3 4.0  2 
2 name4 5.0  2 
3 name5 0.0  2 

Pivot его. Колонки естественно идентифицируемый файл они берутся с именованием, используемое в fileid:

df.pivot('A', 'fileid', 'B') 
Out[192]: 
fileid 1 2 
A    
name1 4.0 3.0 
name2 3.0 NaN 
name3 2.0 4.0 
name4 NaN 5.0 
name5 NaN 0.0 

Для более широкой аудитории, я считаю этот подход выгодно, потому что, когда мы имеем дело с намного больше файлов или когда мы хотим, чтобы распараллелить расчет, этот подход хорошо согласуется с dask: вы применяете simple recipe here, чтобы получить возможность загрузки файлов в ваш архив параллельно и одновременно с добавлением столбца fileid. И теперь вы можете вычислить всю свою результирующую фреймворку параллельно «бесплатно» (например, еще 5 строк кода, import dask) ...

+0

Ничего себе, я не думал, что это будет так изящно. Спасибо! – Sosi

+0

У меня возникают проблемы с запуском моего кода из-за проблем с памятью, вероятно, из-за размера файла и количества файлов. Я полагаю, что распараллеливание не решает мою проблему. Как бы вы это сделали? Теперь мой подход состоит в том, чтобы попытаться разделить входы и выходы на половину, а затем снова обработать новые таблицы. – Sosi

Смежные вопросы