在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文件进行多列排序的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中按日期对 CSV 进行排序

如何使用 python 对 CSV 文件的多列进行排序?

如何在 Laravel 5.1 中按多列对 Illuminate Collection 进行排序?

如何在 Linux 命令行中按大小对文件进行排序

Python对多列文件中的数字进行排序[重复]

在 PyQt 模型中按多列排序