2017-01-17 11 views
0

У меня есть куча файлов в каталоге 698, если быть точным. Каждый файл содержит дату и уникальный идентификатор, а также имя. Как так:Могу ли я группировать файлы по дате и идентификатору и выполнять их различие?

import pandas as pd 
from pandas import Series, DataFrame 
import numpy as np 
import csv 
import os 
import re 

20151231_7801_Test_Maps.txt 
20151231_7801_Test_Items.txt 
20151231_7802_Test_Maps.txt 
20151231_7802_Test_Items.txt 

Я ищу группировать их по дате и идентификатор, откройте каждый из файлов (карты, и элементы), и сделать анализ различий по некоторым идентификаторам в файле. Как мне это сделать?

До сих пор я это как мой код, но я не знаю, как через итерацию и открыть каждый файл в каждой группе:

groups = defaultdict(list) 
for filename in os.listdir('F:\Desktop'): 
    date = filename[:8] 
    identifier = filename[10:14] 
    basename, extension = os.path.splitext(filename) 
    groups[date, identifier].append(filename) 

Мои выходные печатает некоторые группы правильно, но не все, для пример:

('20151231','7801')['20151231_7801_Test_Maps.txt, 20151231_7801_Test_Items.txt] 

Некоторые группы печатают только один файл, хотя для этой даты и идентификатора имеется два файла.

Это не моя основная проблема, но как только они разбиты на группы, я хотел бы назначить каждый файл в группе с dataframe так:

for key in groups: 
    maps = pd.read_csv(file1, sep = '\t', usecols = ['ID'], skipfooter = 0, engine = 'python') 
    items = pd.read_csv(file2, sep = '\t', usecols = ['ID'], skipfooter = 0, engine = 'python') 

    #checks IDs between the two files and looks for differences 
    set(maps.ID).difference(items.ID) 

Может кто-то пожалуйста, помогите с группировкой файлов по дате и идентификатору, и итерации, открывая файлы по группам? Благодаря!

ответ

0

Принимая от ответа Shijo, я нашел очень хороший способ сделать это.

groups = defaultdict(list) 
output = [] 

for filename in os.listdir(pathloc): 
date = filename[:8] 
identifier = filename[14:18] 
basename, extension = os.path.splitext(filename) 
groups[date, identifier].append(filename) 


for key, fnames in groups.iteritems(): 
filedicts = {} 
print list(fnames) 
maps = pd.read_csv(pathloc+fnames[1], sep = '\t', usecols = ['ID'], skipfooter = 0, engine = 'python') 
items = pd.read_csv(pathloc+fnames[0], sep = '\t', usecols = ['ID'], skipfooter = 0, engine = 'python') 



diffs = set(maps.ID).symmetric_difference(items.ID) 

filedicts['FileIDKey'] = list(key) 
filedicts['Missing_IDs'] = list(diffs)       
filedicts['FileNames'] = fnames 

output.append(filedicts) 

Это позволяет мне тогда пойти и добавить этот мастер список словаря к dataframe:

new = pd.DataFrame(output) 
1

взял некоторую помощь от https://stackoverflow.com/a/20228113/6626530 и сделал это

import pandas as pd 


from collections import defaultdict 

difference = pd.DataFrame(columns=('Filename1', 'Filename2', 'DiffID1','DiffID2')) 

pathloc ='C:\Users\shmathew\Desktop\Sample\\abc\\' 
groups = defaultdict(list) 
for filename in os.listdir(pathloc): 
    date = filename[:8] 
    identifier = filename[10:14] 
    basename, extension = os.path.splitext(filename) 
    groups[date, identifier].append(filename) 



for key,filenames in groups.iteritems(): 
    #print " processing following files" 
    #print filenames 
    maps = pd.read_csv(pathloc+filenames[1], sep = '\t', usecols = ['ID'], skipfooter = 0, engine = 'python') 
    Items = pd.read_csv(pathloc+filenames[0] , sep = '\t', usecols = ['ID'], skipfooter = 0, engine = 'python') 
    df = pd.concat([maps, Items]) 
    df = df.reset_index(drop=True) 
    df_gpby = df.groupby(list(df.columns)) 
    idx = [x[0] for x in df_gpby.groups.values() if len(x) == 1] 




    #print "\n\n Difference \n\n" 
    ids= (df.reindex(idx)) 
    row =list(filenames); 
    row.extend(list(ids['ID'])) 

    print row 
    # difference.append(row) 
    difference.append(row) 
print difference 

выход

['20151231_7802_Test_Items.txt', '20151231_7802_Test_Maps.txt', '00432931830TRNY1 ', '00432xx0TRNY1 '] 
['20151231_7801_Test_Items.txt', '20151231_7801_Test_Maps.txt'] 
Empty DataFrame 
Columns: [Filename1, Filename2, DiffID1, DiffID2] 
Index: [] 
+0

Спасибо! Это отлично работает, мне интересно, есть ли способ сделать это в единый столбец DataFrame с именем Difference с именем файла/ID рядом с каждой записью? (Было бы проще для фильтрации отчетов) – staten12

+0

обновил код, но не смог сделать их в Dataframe – Shijo

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

  • Нет связанных вопросов^_^