【问题标题】:How to sort two columns at once using sorted()如何使用 sorted() 一次对两列进行排序
【发布时间】:2016-03-19 23:15:57
【问题描述】:

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

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

【问题讨论】:

  • 你的意思是你想要一个subsort?当第一列相等时对第二列进行排序?
  • 当我使用 sortedColumn = sorted(csv_opener,key=operator.itemgetter(0)) 它对第一列进行排序,但如果我将其更改为 sortedColumn = sorted(csv_opener,key=operator.itemgetter( 1)) 它将对第二列进行排序,但第一列仍将保持未排序
  • 对,main 排序顺序是哪一种?按字母顺序在第 0 列,然后或在第 0 列中的相等值,按第 1 列降序排序?在您的问题中添加示例永远不会有什么坏处。

标签: python sorting csv python-3.x


【解决方案1】:

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

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

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

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

【讨论】:

  • 是的,这正是我所需要的!谢谢!
【解决方案2】:

Martijn Pieters 已经提供了一个完美的答案,但我认为如果你没有考虑过处理 CSV 数据的情况,我认为值得一试PandasDataFrame。

您可以使用pandas.read_csv() 将CSV 输入读取为DataFrame,然后使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 2015-05-06
    • 2019-12-27
    • 2013-09-16
    • 2019-07-29
    相关资源
    最近更新 更多