在Python中计算每年的不同ID

时间:2016-10-27 15:15:27

标签: python

假设我们有类似的文件(第一列引用ID号,第二列引用年份):

1|2015
1|2015
1|2015
2|2015
2|2015
2|2015
3|2014
3|2014
4|2014
4|2014
5|2013

任务是计算每年有多少身份证。例如,在我们的例子中,输出文件应为:

2015|2
2014|2
2013|1

计算这些频率的最合适的编程结构是什么?我的初步尝试粘贴在下面。 (当前代码仅打印不同ID的数量。)

tmp_id = ''
counter = 0
with open('test.txt') as my_file:
    for line in my_file:
        id, year = line.strip().split('|')
        if (id != tmp_id):
            counter = counter + 1
        tmp_id = id
print(counter)

1 个答案:

答案 0 :(得分:2)

我会这样做:

my_file = r'..\dummy.csv'

my_dict = dict()
with open(my_file, 'r') as f:
    for rows in f:
        v, k = rows.strip().split('|')
        my_dict.setdefault(k, [])
        my_dict[k].append(v)

for keys, values in my_dict.items():
    my_dict[keys] = len(set(values))

print(my_dict)  # prints -> {'2013': 1, '2014': 2, '2015': 2}

with open(outfile, 'w') as f_out:
    for k, v in my_dict.items():
        f_out.write(k + '|' + v + '\n')

正在发生的是创建一个dict来存储数据。 dict的选择来自于存在关联并且必须保留的事实(无论第一列是什么年份)。这就是dicts的用途..

然后我们遍历文件并继续使用方便的.setdefault()方法在词典中添加dict键(年)(如果它们不存在)。它们的值初始化为空列表,其中第一列的数字将被附加。

当收集完所有内容后,我们再次浏览dict并将所有值(列表)替换为相应集合的长度。请注意,将列表传递给set()将删除列表中的重复项。最后,len()返回容器的长度。

我们最不希望的是将结果写入一个简单的工作文件。只需使用写标志w打开一些内容并迭代dict。请注意,默认情况下,write()方法不会添加换行符,因此您必须自己使用'\n'。欢呼声。

说了这么多,如果使用pandas代替,上面的代码可能会被两行代替。我会让你自己调查一下。