簡體   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