2017-02-21 2 views
0

Я сравниваю один столбец ('label') из нескольких почти идентичных файлов cvs.Как я могу использовать pandas для поиска только строк с разными значениями столбцов?

Я написал код, который создает новый кадр данных из файлов, которые я сравниваю:

def main(argv): 


    dirs = sys.argv[1:] 
    print ("Directorys to process:"+ str(dirs)) 
    files = glob.glob(dirs[0]+"/*.csv") 
    files = [f.replace(dirs[0]+"/","") for f in files] 
    print ("files to process:"+str(files)) 

    dfList =[dirs] 
    dfLabel = pd.DataFrame() 
    resultdf = pd.DataFrame() 
    for file in range(0,len(files)): 
     filename = files[file] 
     for index in range(0,len(dirs)): 
      dirname = dirs[index] 
      dfItem = pd.read_csv(dirname+"/"+filename) 
      resultdf[dirname] = dfItem['label'] 
     resultdf.fillna(value=0, inplace=True) 
     resultdf['mode_average'] = resultdf.mode(axis=1) 
     # new step to remove rows where all values are equal 
     resultdf.to_csv("Comparison_of_"+filename,index=False) 

if __name__ == "__main__": 
    main(sys.argv[1:]) 

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

+1

Правильно ли я понимаю, что вы хотите собрать все уникальные строки по многим CSV-файлам в одном файле/dataframe? – Marat

+0

Если вы создаете пример [Минимальный, полный и проверенный] (http://stackoverflow.com/help/mcve), это облегчает нам помощь. –

+0

Я хочу собрать уникальные строки DataFrame, которые были сформированы, когда я собрал столбец меток из нескольких файлов. Например, существует 3 каталога, A, B C. Каждый содержит файл1.csv и содержит столбец меток. Содержимое столбца метки всегда либо пустое, либо содержит один или два. В этом примере пусть файл1 в A и C будет идентичным. В A и B каждая четвертая строка имеет 2. Файл file1.csv в каталоге B почти идентичен, но в 3 случаях вместо них не помечено ничего. Я хочу найти эти три строки. Результат должен содержать исходный индекс строки. –

ответ

0

Я решил это с помощью pandasql.

В этом отчете показан номер строки и сравнение результатов всех меток, где один не соответствует среднему по режиму.

import pandas as pd 
import os, sys,glob 
import getopt 
import pandasql 
from pandas import * 
from pandasql import sqldf 


dirs = sys.argv[1:] 
print ("Directorys to process:"+ str(dirs)) 
files = glob.glob(dirs[0]+"/*.csv") 
files = [f.replace(dirs[0]+"/","") for f in files] 
print ("files to process:"+str(files)) 
dfList =[dirs] 
resultdf = pd.DataFrame() 
for file in range(0,len(files)): 
    filename = files[file] 
    for index in range(0,len(dirs)): 
     dirname = dirs[index] 
     dfItem = pd.read_csv(dirname+"/"+filename) 
     resultdf[dirname] = dfItem['label'] 
    resultdf.fillna(value=0, inplace=True) 
    resultdf['mode_average'] = resultdf.mode(axis=1) 
    pysqldf = lambda q: sqldf(q, globals()) 

    for index in range(0,len(dirs)): 
     dirname = dirs[index] 
     q = "select _ROWID_,* from resultdf where "+ dirname +" != mode_average" 
     diffs = pysqldf(q)  
     if (len(diffs) >0): 
      print ("Advisor "+dirname+ " had deviations in "+filename) 
      diffs.to_csv(dirname+"_"+filename+"_deviation.csv",index = False)   
      print(diffs) 
    resultdf.to_csv("Comparison_of_"+filename ,index=False) 
Смежные вопросы