Python 使用函数参数筛选CSV文件
因此,我正在编写一个函数,根据函数参数过滤csv文件,然后在过滤后查找列的平均值。我只允许使用导入csv(没有熊猫),不能使用lambda或任何其他python“高级”快捷方式。我觉得我可以很容易地得到平均部分,但我在根据我提到的参数和约束条件进行过滤时遇到了麻烦。我通常会用熊猫来做这件事,这使得这个过程更容易,但我做不到 这是我的代码:Python 使用函数参数筛选CSV文件,python,csv,filter,Python,Csv,Filter,因此,我正在编写一个函数,根据函数参数过滤csv文件,然后在过滤后查找列的平均值。我只允许使用导入csv(没有熊猫),不能使用lambda或任何其他python“高级”快捷方式。我觉得我可以很容易地得到平均部分,但我在根据我提到的参数和约束条件进行过滤时遇到了麻烦。我通常会用熊猫来做这件事,这使得这个过程更容易,但我做不到 这是我的代码: def calc_avg(self, specific, filter, logic, threshold): with o
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
,那么你在函数参数中给出了一个不正确的列名。请确保大小写正确。非常感谢,我应该共享加载数据