Python 使用函数参数筛选CSV文件

Python 使用函数参数筛选CSV文件,python,csv,filter,Python,Csv,Filter,因此,我正在编写一个函数,根据函数参数过滤csv文件,然后在过滤后查找列的平均值。我只允许使用导入csv(没有熊猫),不能使用lambda或任何其他python“高级”快捷方式。我觉得我可以很容易地得到平均部分,但我在根据我提到的参数和约束条件进行过滤时遇到了麻烦。我通常会用熊猫来做这件事,这使得这个过程更容易,但我做不到 这是我的代码: def calc_avg(self, specific, filter, logic, threshold): with o

因此,我正在编写一个函数,根据函数参数过滤csv文件,然后在过滤后查找列的平均值。我只允许使用导入csv(没有熊猫),不能使用lambda或任何其他python“高级”快捷方式。我觉得我可以很容易地得到平均部分,但我在根据我提到的参数和约束条件进行过滤时遇到了麻烦。我通常会用熊猫来做这件事,这使得这个过程更容易,但我做不到

这是我的代码:

def calc_avg(self, specific, filter, logic, threshold):
        
        with open(self.load_data, 'r') as avg_file:
            for row in csv.DictReader(avg_file, delimiter= ','):
                specific = row[specific]
                filter = int(row[filter])
                logic = logic
                threshold = 0
                
                if logic == 'lt':
                    filter < threshold
                    
                elif logic == 'gt':
                    filter > threshold
                    
                elif logic == 'lte':
                    filter <= threshold
                    
                elif logic == 'gte':
                    filter >= threshold
                    
这是代码和列标题的格式。 样本数据:

RecordID SAPS-I SOFA    Length_of_stay  
132539    6      1         5    
132540    16     8         8    
132541    21     11       19    
132545    17     2         4    
132547    14     11        6    
132548    14     4         9    
132551    19     8         6    
132554    11     0        17    

你没有对你的比较结果做任何事。您需要在
if
语句中使用它们,以便在平均值计算中包含特定值

def calc_avg(self, specific, filter, logic, threshold):
    with open(self.load_data, 'r') as avg_file:
        values = []
        for row in csv.DictReader(avg_file, delimiter= ','):
            specific = row[specific]
            filter = int(row[filter])
            threshold = 0

            if logic == 'lt' and filter < threshold:
                values.append(specific)
            elif logic == 'gt' and filter > threshold:
                values.append(specific)
            elif logic == 'lte' and filter <= threshold:
                values.append(specific)
            elif logic == 'gte' and filter >= threshold:
                values.append(specific)
        if len(values) > 0:
            return sum(values) / len(values)
        else:
            return 0
def calc_平均值(自身、特定、过滤器、逻辑、阈值): 打开(self.load_data,'r')作为avg_文件: 值=[] 对于csv.DictReader中的行(avg_文件,分隔符=','): 特定=行[特定] filter=int(行[filter]) 阈值=0 如果逻辑==“lt”且过滤器<阈值: values.append(特定) elif逻辑=='gt'和过滤器>阈值: values.append(特定) elif逻辑==“lte”和过滤器=阈值: values.append(特定) 如果len(值)>0: 返回和(值)/长度(值) 其他: 返回0 更新

此选项计算
逻辑
一次,并返回一个函数
compare
,该函数可在迭代行时使用。数据有多行时速度更快

#作为函数编写,因为您不共享加载数据的定义
#但主要思想可以转化为一门课
def calc_平均值(自身、特定、过滤器、逻辑、阈值):
如果存在(阈值,str):
阈值=浮动(阈值)
def lt(a,b):返回ab
def lte(a,b):返回a=b
如果逻辑='lt':比较=lt
elif逻辑=='gt':比较=gt
elif逻辑=='lte':比较=lte
elif逻辑=='gte':比较=gte
将io.StringIO(self)作为平均文件:#更改以打开实际文件
运行总数=运行计数=0
对于csv.DictReader中的行(avg_文件,分隔符=','):
如果比较(int(行[过滤器]),阈值):
运行_sum+=int(行[特定])
#或浮动(行[特定])
运行计数+=1
如果运行_count==0:
#甚至没有一行通过过滤器
返回0
其他:
返回运行总和/运行计数
打印(计算平均值(数据,“停留时间”、“沙发”、“lt”、“15”))
打印(计算平均值(数据,“停留时间”、“沙发”、“lt”、“2”))
打印(计算平均值(数据,“停留时间”、“沙发”、“lt”、“0”)
输出

9.25
11.0
0
9.25
11.0

初步答复

为了过滤行,一旦确定了应该使用哪种类型的不等式,就必须进行比较。这里的代码将其存储在布尔
include

然后您可以有两个变量:
running\u sum
running\u count
,稍后将其除以以返回平均值

导入io
导入csv
#作为函数编写,因为您不共享load_数据的定义
#但主要思想可以转化为一门课
def calc_平均值(自身、特定、过滤器、逻辑、阈值):
如果存在(阈值,str):
阈值=浮动(阈值)
将io.StringIO(self)作为平均文件:#更改以打开实际文件
运行总数=运行计数=0
对于csv.DictReader中的行(avg_文件,分隔符=','):
#您的代码有:filter=int(行[filter])
value=int(行[过滤器])#避免覆盖参数
如果逻辑=='lt'且值<阈值:
include=True
elif逻辑=='gt'和值>阈值:
include=True
elif逻辑=='lte'和值=阈值:#应该是'ge'
include=True
或导入AST并考虑一行中的所有情况
#如果ast.literal_eval(f'{value}{logic}{treshold}'):
#include=True
其他:
include=False
如果包括:
运行_sum+=int(行[特定])
#或浮动(行[特定])
运行计数+=1
返回运行总和/运行计数
数据=“记录ID、SAPS-I、沙发、停留时间
132539,6,1,5
132540,16,8,8
132541,21,11,19
132545,17,2,4
132547,14,11,6
132548,14,4,9
132551,19,8,6
132554,11,0,17"""
打印(计算平均值(数据,“停留时间”、“沙发”、“lt”、“15”))
打印(计算平均值(数据,“停留时间”、“沙发”、“lt”、“2”))
输出

9.25
11.0
0
9.25
11.0

欢迎VS,您可以提供示例数据吗?您可以使用
过滤器
两次:作为参数和整数。。。
SOFA
应该是列名吗?您好,我在示例数据中添加了。我必须使用过滤器作为参数,并将其更改为整数,因为我得到一个错误,该错误表示我无法比较两种不同的类型。我很困惑,因为数字也是作为阈值而不是数字的字符串给出的。这与问题无关,但为什么要使用调用方提供的参数而不是
threshold=0
?特定的
filter
的预期角色是什么?您的示例数据的预期输出是什么?我得到了代码的一个关键错误。我想这可能是因为我使用的是Dictreader,但如果我不这样做,我真的不知道如何确保我可以按标题过滤所有内容。如果你得到
keyrerror
,那么你在函数参数中给出了一个不正确的列名。请确保大小写正确。非常感谢,我应该共享加载数据