如何使用sorted()一次对两列进行排序

时间:2015-12-14 12:56:13

标签: python sorting csv python-3.x

我有一个.csv文件,它包含两个我要排序的列。 我想按字母顺序对第一列进行排序,将第二列按最高数字排序到最低。

我使用sortedColumn = sorted(csv_opener,key=operator.itemgetter(0))按字母顺序对第一列进行排序,但我也想对第二列做同样的事情。我该怎么做呢?

2 个答案:

答案 0 :(得分:6)

您可以通过让key callable返回一个元组来按两个方面进行排序。

我假设第二列是可转换为整数的字符串:

sortedColumn = sorted(csv_opener, key=lambda row: (row[0], -int(row[1])))

通过从row[1]返回否定值,您可以从最高到最低排序,而主要排序已完成,或row[0]按字母顺序排序。

所以对于样本行:

Alpha, 10
Beta, 30
Alpha, 42
Gamma, 81
Beta, 10

排序后的输出为您提供:

Alpha, 42
Alpha, 10
Beta, 30
Beta, 10
Gamma, 81

首先按字母顺序排序第一列,然后排序第一列中的相等值,行按第二列的降序排序。

答案 1 :(得分:2)

Martijn Pieters已经提供了一个完美的答案,但我认为值得查看Pandas DataFrame来处理CSV数据,以防您没有考虑过。

您可以使用pandas.read_csv()将CSV输入作为数据框阅读,然后使用DataFrame.sort_values()按照您想要的方式对其进行排序。

要添加示例,我们首先生成一些随机样本数据

from faker import Factory
from random import randint, choice
import pandas

fake = Factory.create()
names = [fake.name() for i in range(5)]
nums = [randint(1, 50) for i in range(5)]
data = []
for i in range(10):
    data.append((choice(names), choice(nums)))

df = pandas.DataFrame.from_records(data, columns=("Names", "Nums"))

导致,例如

    Names                   Nums
0   Jeffry Wintheiser       25
1   Dr. Corine Sporer PhD   25
2   Jeffry Wintheiser       17
3   Emmett Reilly           17
4   Jeffry Wintheiser       17
5   Emmett Reilly           33
6   Jeffry Wintheiser       33
7   Lilah Purdy             17
8   Emmett Reilly           22
9   Miss Julie Wisoky       25

然后您可以使用sort_values,如下所示

df.sort_values(["Names", "Nums"], ascending=[True, False])

导致

    Names                   Nums
1   Dr. Corine Sporer PhD   25
5   Emmett Reilly           33
8   Emmett Reilly           22
3   Emmett Reilly           17
6   Jeffry Wintheiser       33
0   Jeffry Wintheiser       25
2   Jeffry Wintheiser       17
4   Jeffry Wintheiser       17
7   Lilah Purdy             17
9   Miss Julie Wisoky       25