在python中按大小按多列排序csv文件

时间:2015-07-29 20:15:17

标签: python sorting csv

我想先将一个csv文件按一列排序,然后再按另一列排序。

我尝试了一些在线的方法来对具有多列的csv文件进行排序。问题是排序是从左到右进行的,所以我得到类似这样的东西:1,10,100,101,102 ....当我想要这样的东西时,如1,2,3,4,5,6,7 ,8,9,10,11 ......

我用过这个讨论: Sorting CSV in Python 而这个模块: csvsort

我很感激任何参考或代码。

4 个答案:

答案 0 :(得分:2)

听起来你想要的是序数/数字排序,但你得到的是字母排序。按字母排序将是1,10,100,2等,而顺序排序可以得到1,2,10,100。

当您从CSV读入数据时,您尝试排序的数据可能是字符串格式,您需要在调用Python的排序函数之前将其转换为int。

您可以通过将key = int作为参数传递给sort函数来执行此操作,这将导致它对正在排序的成员调用int()。

可在此处找到更多信息:How to sort a list numerically?

答案 1 :(得分:1)

我认为这应该有用,

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)

您只需在排序时将密钥转换为int类型。

Python令人印象深刻!

答案 2 :(得分:0)

如果您使用的熊猫库版本> 0.25,则可以使用 sort_values

$results = $statement->fetchAll();

if($results) {
    foreach($result as $row) {
        // ...
    }
} else {
    echo 'No records!';
}

df.sort_values([''Name','Sex'],ascending = [True,True])

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

答案 3 :(得分:0)

我有一个包含 input.csv 数据的 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]))