繁体   English   中英

如何通过python中的两列对csv文件进行排序?

[英]how to sort a csv file by two columns in python?

我有一个包含6列的csv文件。

我想按第2列然后按第3列对其进行排序。

我当前的代码正在创建一个空白文件:

import csv
with open('original.csv', mode='rt') as f, open('sorted.csv', 'w') as final:
        writer = csv.writer(final, delimiter='\t')
        reader = csv.reader(f, delimiter=',')
        _ = next(reader)
        sorted1 = sorted(reader, key=lambda row: int(row[1]))
        sorted2 = sorted(reader, key=lambda row: int(row[2]))
        for row in sorted2:
            writer.writerow(row)

我究竟做错了什么?

您的输出文件为空的原因是因为

sorted2 = sorted(reader, key=lambda row: int(row[2]))

正在尝试对reader的数据进行排序,但是您已经读取了前面的sorting语句中的所有数据,因此没有任何内容可供读者读取。 但是,你真的希望从数据重新排序reader ,要在数据重新排序sorted1 ,就像这样:

import csv

with open('original.csv', mode='rt') as f, open('sorted.csv', 'w') as final:
    writer = csv.writer(final, delimiter='\t')
    reader = csv.reader(f, delimiter=',')
    _ = next(reader)
    sorted1 = sorted(reader, key=lambda row: int(row[1]))
    sorted2 = sorted(sorted1, key=lambda row: int(row[2]))
    for row in sorted2:
        writer.writerow(row)

OTOH,无需分两次进行排序。 您可以通过更改键功能一次完成该操作。

import csv

with open('original.csv', mode='rt') as f, open('sorted.csv', 'w') as final:
    writer = csv.writer(final, delimiter='\t')
    reader = csv.reader(f, delimiter=',')
    _ = next(reader)
    sorted2 = sorted(reader, key=lambda row: (int(row[1]), int(row[2])))        
    for row in sorted2:
        writer.writerow(row)

该键函数首先通过row[1]值比较项目,如果这些值相同,则通过row[2]值对其进行比较。 可能无法给出您真正想要的顺序。 您可能需要颠倒这些测试的顺序:

key=lambda row: (int(row[2]), int(row[1])) 

正如Peter Wood在评论中提到的,Writer对象具有writerows方法,该方法将在一次调用中写入所有行。 这比在for循环中逐行写入行更有效。

顺便说一句,无需执行此任务:

_ = next(reader)

我想这很清楚地表明您正在丢弃第一行,但是您可以在不执行分配的情况下编写调用:

next(reader)

有了熊猫,您可以轻松实现。

import pandas as pd

df = pd.read_csv('original.csv', delimiter='\t')

df = df.sort_values(['col1', 'col2'], ascending=[True, True]) # parameter ascending is applied to 'col1' and 'col2' respectively.

df.to_csv('sorted.csv')

doc到熊猫read_csv

doc到pandas排序

lambda函数可以返回一个元组

sorted(reader, key=lambda row: (int(row[1]), int(row[2])))

尝试这个

 with open('original.csv',mode='r') as csvfile:
        reader = csv.DictReader(csvfile, delimiter=";")
        sortedlist = sorted(reader, key=lambda row:(int(row[1]), int(row[2])))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM