我有一个.csv文件,它包含两个我要排序的列。 我想按字母顺序对第一列进行排序,将第二列按最高数字排序到最低。
我使用sortedColumn = sorted(csv_opener,key=operator.itemgetter(0))
按字母顺序对第一列进行排序,但我也想对第二列做同样的事情。我该怎么做呢?
答案 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