繁体   English   中英

使用python在csv文件中查找列的最大值

[英]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]))

理想的解决方案是重新组织代码,使其仅扫描行一次。 例如,如果您了解minmax工作原理,则可以构建自己的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM