我有一个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))
答案 0 :(得分:0)
您可以使用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+),并且未来无法保证,因此如果行顺序很重要,您可能希望按键排序。