Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用pandas仅查找具有不同列值的行?_Python_Pandas - Fatal编程技术网

Python 如何使用pandas仅查找具有不同列值的行?

Python 如何使用pandas仅查找具有不同列值的行?,python,pandas,Python,Pandas,我正在比较几个几乎相同的cvs文件中的一列(“标签”) 我已经编写了一些代码,可以从正在比较的文件中创建新的数据帧: 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] pr

我正在比较几个几乎相同的cvs文件中的一列(“标签”)

我已经编写了一些代码,可以从正在比较的文件中创建新的数据帧:

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:])  

这是我想要的工作方式,但我真正感兴趣的只是查看其中一个输入文件不同的行。我希望它们在大多数情况下都是一样的,有成百上千行。是否有一种内置的方法可以只计算和返回行中一个或多个值不同的行?我运行比较的文件和目录的数量可能会波动。

我在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) 

我是否正确理解您希望在单个文件/数据框中收集多个CSV文件中的所有唯一行?如果您创建一个示例,我们将更容易为您提供帮助。我希望收集从多个文件收集标签列时形成的数据框的唯一行。例如,有3个目录,A、B和C。每个目录包含file1.csv,并且包含一个标签列。标签列内容始终为空,或包含1或2。在本例中,让A和C中的文件1相同。在A和B中,每4行有一个2。目录B中的file1.csv几乎相同,但在3个实例中,没有标记任何内容,而是两个。我想找到那三排。结果应包含原始行索引。*对上述示例的澄清。在A和C中,每4行有一个2。我可能能够得到我需要的答案的一种方法是返回任何列与mode_average列不匹配的行索引。我可以使用itetrows()来查找它吗?