[英]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')
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.