我正在尝试在 Python 中构建一些代码,将列中的多个值分成单独的行,并Active-Ticket
根据时间戳的同一天聚合列,是否可以使用任何内部库,或者我是否需要安装外部库?
我的示例文件是(目前,Active-Tickets 列是空的):
输入.csv
Timestamp,CaseID,Active-Tickets
14FEB2017:10:55:23,K456 G578 T213,
13FEB2017:10:56:12,F891 A63,
14FEB2017:11:59:14,T427 T31212 F900000,
15FEB2017:03:55:23,K456 G578 T213,
14FEB2017:05:56:12,F891 A63,
我正在努力实现的目标:
输出.csv
Timestamp,CaseID,Active-Tickets
14FEB2017:10:55:23,K456,8 (because there are 8 cases happened on the same day)
14FEB2017:10:55:23,G578,8
14FEB2017:10:55:23,T213,8
13FEB2017:10:56:12,F891,2 (because there are 2 cases happened on the same day)
13FEB2017:10:56:12,A63,2
14FEB2017:11:59:14,T427,8
14FEB2017:11:59:14,T31212,8
14FEB2017:11:59:14,F900000,8
15FEB2017:03:55:23,K456,3 (because there are 3 cases happened on the same day)
15FEB2017:03:55:23,G578,3
15FEB2017:03:55:23,T213,3
14FEB2017:05:56:12,F891,8
14FEB2017:05:56:12,A63,8
我的想法是:
获取列 Timestamp 的值
检查日期是否相同,
将所有由空格分隔的 CaseID 存储到基于日期的列表中,
计算每个日期列表中元素的数量然后
将计数元素的值返回到 中
Active-Tickets
。
但是这里的问题是,数据量不小,假设一天最少有50个案例,那我觉得我的方式不太可能。
这是使用itertools.chain.from_iterable()
. 它只将计数保留在内存中,因此可能适用于您的情况。它读取csv
文件两次。一次获取计数,一次写入输出,但仅使用迭代器进行读取,因此应减少内存需求。
代码:
import csv
import itertools as it
from collections import Counter
# read through file and get counts per date
with open('test.csv', 'rU') as f:
reader = csv.reader(f)
header = next(reader)
dates = it.chain.from_iterable(
[date for _ in ids.split()]
for date, ids in ((x[0].split(':')[0], x[1]) for x in reader))
counts = Counter(dates)
# read through file again, and output as individual records with counts
with open('test.csv', 'rU') as f:
reader = csv.reader(f)
header = next(reader)
records = it.chain.from_iterable(
[(l[0], d) for d in l[1].split()] for l in reader)
new_lines = (l + (str(counts[l[0].split(':')[0]]), ) for l in records)
with open('test2.csv', 'wb') as f_out:
writer = csv.writer(f_out)
writer.writerow(header)
writer.writerows(new_lines)
结果:
Timestamp,CaseID,Active-Tickets
14FEB2017:10:55:23,K456,8
14FEB2017:10:55:23,G578,8
14FEB2017:10:55:23,T213,8
13FEB2017:10:56:12,F891,2
13FEB2017:10:56:12,A63,2
14FEB2017:11:59:14,T427,8
14FEB2017:11:59:14,T31212,8
14FEB2017:11:59:14,F900000,8
15FEB2017:03:55:23,K456,3
15FEB2017:03:55:23,G578,3
15FEB2017:03:55:23,T213,3
14FEB2017:05:56:12,F891,8
14FEB2017:05:56:12,A63,8
2.6 中的计数器
collections.Counter
已为 python 2.5+ 反向移植(此处)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句