csv文件中的python组行以生成新的csv文件

时间:2017-06-22 15:48:44

标签: python-2.7 csv

我有一个csv文件,如下所示:

原始csv:

vehicle,status,count 
car1,used,10 
car2,free,20 
car1,free,3 
car3,used,30 
car3,free,10

我正在尝试按照其状态对这些车辆进行分组,然后创建一个这样的文件: 最终输出:

vehicle,free,used
car1,3,10
car2,20,0
car3,10,30

我正在看python集合模块,我认为可以用于这样的任务。但不知道如何继续 任何指针都将非常感激。

到目前为止,我有以下代码:

import collections
import csv

out=[]

with open('file.csv', "rb") as f:
        reader = csv.DictReader(f)
        for row in reader:
                veh = row["vehicle"]

                out[veh] = out.get(veh, collections.defaultdict(int))

1 个答案:

答案 0 :(得分:0)

使用Pandas:

您可以使用pandas执行类似的操作:

>>> import pandas as pd
>>> cars = pd.read_csv('/tmp/cars.csv')
>>> cars2 = pd.pivot_table(cars, index=["vehicle"], columns=["status"]).fillna(0)
>>> cars2.columns = ["free", "used"]
>>> print(cars2.astype(int).to_csv())
vehicle,free,used
car1,3,10
car2,20,0
car3,10,30

原始数据中不存在car2 x used类别,因此fillna用于将缺失值替换为0。

旋转操作创建了一个MultiIndex,因此可以用更简单的东西替换。

astype(int)在这里是因为默认情况下,这些值被处理为浮动。

使用默认

另一种方法,将计数存储在defaultdict个整数对中:

#!/usr/bin/env python3

from collections import defaultdict

with open("cars.csv", "r") as cars_file:
    header = cars_file.readline()
    cars_counter = defaultdict(lambda : [0, 0])
    for line in cars_file:
        veh, status, count = line.strip().split(",")
        if status == "free":
            cars_counter[veh][0] += int(count)
        elif status == "used":
            cars_counter[veh][1] += int(count)
        else:
            raise ValueError("""Unknown status "{status}".""".format(status=status))

print("vehicle,free,used")
for car, (free, used) in cars_counter.items():
    print(",".join((car, str(free), str(used))))

3.6之前的python版本无法保证输出顺序(请参阅Dictionaries are ordered in Python 3.6+),并且未来无法保证,因此如果行顺序很重要,您可能希望按键排序。