在python中按大小对csv文件进行多列排序
Posted
技术标签:
【中文标题】在python中按大小对csv文件进行多列排序【英文标题】:Sorting csv file by multiple columns by magnitude in python 【发布时间】:2015-10-21 00:19:19 【问题描述】:我想先对 csv 文件按一列排序,然后再按另一列排序。
我已经尝试了一些在线方法来对具有多列的 csv 文件进行排序。问题是排序是从左到右进行的,所以当我想要这样的 1、2、3、4、5、6、7 , 8, 9, 10, 11...
我使用了这个讨论: Sorting CSV in Python 这个模块: csvsort
如果有任何参考或代码,我将不胜感激。
【问题讨论】:
添加一些输入和预期输出 【参考方案1】:听起来你想要的是序数/数字排序,但你得到的是字母排序。字母顺序为 1、10、100、2 等,而序数排序为 1、2、10、100。
您尝试排序的数据在从 CSV 读取时可能是字符串格式,您需要在调用 Python 的排序函数之前将其转换为 int。
您可以通过将 key=int 作为参数传递给排序函数来做到这一点,这将导致它对正在排序的成员调用 int()。
更多信息可以在这里找到:How to sort a list numerically?
【讨论】:
【参考方案2】:我认为这应该可行,
import csv
reader = csv.reader(open("file.csv"))
sortedlist = sorted(reader, key=int(operator.itemgetter(3)))
# 3 or 'n' depending upon which column you want to sort the data
with open("sorted_file.csv", 'wb') as f:
csv.writer(f).writerows(sortedlist)
你只需要在排序时将key转换为int类型。
Python 令人印象深刻!
【讨论】:
【参考方案3】:如果您使用的 pandas 库版本 > 0.25,那么您可以使用 sort_values
import pandas as pd
df = pd.read_csv('biostats.csv')
df
Name Sex Age Height (in) Weight (lbs)
0 Alex M 41 74 170
1 Page F 31 67 135
2 Quin M 29 71 176
3 Ruth F 28 65 131
4 Ruth F 59 75 131
5 Quin M 19 55 46
df.sort_values(['Name', 'Sex'],升序=[True, True])
Name Sex Age Height (in) Weight (lbs)
0 Alex M 41 74 170
1 Page F 31 67 135
2 Quin M 29 71 176
5 Quin M 19 55 46
3 Ruth F 28 65 131
4 Ruth F 59 75 131
【讨论】:
【参考方案4】:我有一个 csv 文件,其中包含 input.csv 之类的数据:
1285,375,2.0,3.5,2473
260,380,2.0,3.5,3780
2205,35,1.0,1.75,4829
245,25,1.0,1.75,5632
570,1520,1.0,1.75,8240
465,35,1.0,1.75,10287
3325,35,1.0,0.75,20788
2480,75,1.0,1.75,23589
0,15,4.0,7.0,48424
使用operator.itemgetter
时:
import csv
import operator
inputfile="input.csv"
with open(inputfile, newline='') as csvfile:
next(csvfile)
outcsv = csv.reader(csvfile, delimiter=',', quotechar='|')
sorted_csv = sorted(outcsv, key = operator.itemgetter(0))
for eachline in sorted_csv:
print(eachline)
我得到的输出在第一列按字母顺序排序:
['0', '15', '4.0', '7.0', '48424']
['1285', '375', '2.0', '3.5', '2473']
['2205', '35', '1.0', '1.75', '4829']
['245', '25', '1.0', '1.75', '5632']
['2480', '75', '1.0', '1.75', '23589']
['260', '380', '2.0', '3.5', '3780']
['3325', '35', '1.0', '0.75', '20788']
['465', '35', '1.0', '1.75', '10287']
['570', '1520', '1.0', '1.75', '8240']
在第一列对 CSV 文件进行排序,并确保使用数值代替排序。我做了以下事情:
import csv
inputfile="input.csv"
with open(inputfile, newline='') as csvfile:
next(csvfile)
outcsv = csv.reader(csvfile, delimiter=',', quotechar='|')
sorted_csv = sorted(outcsv, key = lambda start_time: int(start_time[0]))
for eachline in sorted_csv:
print(eachline)
输出符合预期。
['0', '15', '4.0', '7.0', '48424']
['245', '25', '1.0', '1.75', '5632']
['260', '380', '2.0', '3.5', '3780']
['465', '35', '1.0', '1.75', '10287']
['570', '1520', '1.0', '1.75', '8240']
['1285', '375', '2.0', '3.5', '2473']
['2205', '35', '1.0', '1.75', '4829']
['2480', '75', '1.0', '1.75', '23589']
['3325', '35', '1.0', '0.75', '20788']
要按大小(数字的值)对任何其他列进行排序,只需替换行中的列号:
sorted_csv = sorted(outcsv, key = lambda start_time: int(start_time[0]))
【讨论】:
以上是关于在python中按大小对csv文件进行多列排序的主要内容,如果未能解决你的问题,请参考以下文章