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