[英]find max of a column in a csv file using python
我正在尝试在csv中找到低于colm的最大值
列表['1154293','885773','-448704','563679','555394','631974','957395','1104047','693464','454932','727272','125016' ,'339251','78523','977084','1158718','332681','-341227','173826','742611','1189806','607363','-1172384','587993' ,'295198','-300390','468995','698452','967828','-454873','375723','1140526','83836','413189','551363','1195111' ,“ 657081”,“ 66659”,“ 803301”,“-953301”,“ 883934”]
我运行了我编写的代码
for row in csvReader:
Revenue.append(row[1])
max_revenue=max(Revenue)
print("max revenue"+str(max_revenue))
但是它不获取最大值,输出得到的是
max revenue 977084
请指教 ,
这里的问题是,您正在构建一列列字符串的列表,但随后希望将最大值作为数字而不是字符串来查找。
您可以通过构建映射到整数的列1字符串的列表来解决此问题,如其他答案所示:
for row in csvReader:
Revenue.append(int(row[1]))
max_revenue=max(Revenue)
但是另一种方法是将键函数用于max
:
for row in csvReader:
Revenue.append(row[1])
max_revenue = max(Revenue, key=int)
更好的是,您可以使用相同的想法,而不需要整个单独的Revenue
列表:
max_revenue_row = max(csvReader, key=lambda row: int(row[1]))
这意味着您将获得整个原始行,而不仅仅是整数值。 因此,例如,如果第2列是与第1列的收入一起使用的用户名,则可以执行以下操作:
max_revenue_row = max(csvReader, key=lambda row: int(row[1]))
best_salesman_name = max_revenue_row[2]
这也避免了在内存中建立一个额外的巨型列表。 它只是一次将每一行读入内存,然后丢弃它们,只记住最大的一行。
这通常很好,但是存在一个潜在的问题:如果您实际上需要扫描两次或多次而不是一次来扫描值,则第一次已经消耗了所有行,因此第二次将找不到任何行。 例如,这将在第二个调用中引发异常:
max_revenue_row = max(csvReader, key=lambda row: int(row[1]))
min_revenue_row = min(csvReader, key=lambda row: int(row[1]))
理想的解决方案是重新组织代码,使其仅扫描行一次。 例如,如果您了解min
和max
工作原理,则可以构建自己的min_and_max
函数,该函数同时执行这两项操作,然后像这样使用它:
min_revenue_row, max_revenue_row =
min_and_max(csvReader, key=lambda row: int(row[1]))
但是有时这是不可能的,或者至少是不可能的,因为您可以弄清楚如何以可读的方式编写。 我假设您不知道如何编写min_and_max
。 所以,你可以做什么?
您有两个不太理想的选择,但通常仍然可以接受:要么将整个文件读入内存,要么多次读取文件。 都来了
rows = list(csvReader) # now it's in memory, so we can reuse it
max_revenue_row = max(rows, key=lambda row: int(row[1]))
min_revenue_row = min(rows, key=lambda row: int(row[1]))
with open(csvpath) as f:
csvReader = csv.reader(f)
max_revenue_row = max(csvReader, key=lambda row: int(row[1]))
with open(csvpath) as f:
# whole new reader, so it doesn't matter that we used up the first
csvReader = csv.reader(f)
min_revenue_row = min(csvReader, key=lambda row: int(row[1]))
在您的情况下,如果CSV文件看上去很小,那么它实际上并不重要,但是我可能会做第一个。
这应该工作。 由于数组的元素是字符串,因此需要首先使用map(int,a)
将它们转换为int。
a=['1154293', '885773', '-448704', '563679', '555394', '631974', '957395', '1104047', '693464', '454932', '727272', '125016', '339251', '78523', '977084', '1158718', '332681', '-341227', '173826', '742611', '1189806', '607363', '-1172384', '587993', '295198', '-300390', '468995', '698452', '967828', '-454873', '375723', '1140526', '83836', '413189', '551363', '1195111', '657081', '66659', '803301', '-953301', '883934']
print(max(map(int, a)))
我认为问题出在数据类型上。 由于您的数字以''表示,因此它们将被解释为字符串,因此考虑到这一点就可以提供最大值。
您可能需要将每个字符串转换为整数。 像这样:
new_list = [int(number) for number in old_list]
希望这可以帮助。
谢谢你们
我转换为int
Revenue.append(int(row[1]))
现在工作正常。
谢谢收获
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.