不使用熊猫分组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不使用熊猫分组相关的知识,希望对你有一定的参考价值。

我有一个csv文件,示例看起来像,

year   product   country
2018    food       us
2018    drink      uk
2019    food       uk
2019    car      japan
2018    food     japan

我可以在不使用pandas或numpy之类的软件包的情况下按年份对信息进行分组吗?我知道我们可以先使用标准软件包csv读取输入。

f = open('text.csv')
csv_f = csv.reader(f)

for row in csv_f:
  ////////

我的预期输出是,

year   product    product_sum
2018    food         2
2018    drink        1
2019    food         1
2019    car          1
答案

有多种方法可以做到这一点。使用树或简单的字典。

此解决方案假定group by中的字段是相邻的。只需很少的更改,您就可以泛化或探索基于树的整洁解决方案。

f = open('text.csv')
delim = "\t"
header = f.readline()
group_dict = 
for l in f.readlines():
      key = delim.join(l.split()[:2])
      if key not in group_dict:
            group_dict[key] = 0
      group_dict[key] +=1

f2 = open('output.txt','w')
f2.write(header)
for k,v in group_dict.items():
      f2.write(delim.join([k,str(v)])+'\n')```
另一答案

您可以使用collections.Counter来计算出现的次数。

collections.Counter

要将其写回到CSV文件,您可以使用f = open('text.csv') csv_f = csv.reader(f) next(csv_f, None) # Ignore header row c = collections.Counter((year, product) for year, product, country in csv_f) print(c) # Output: Counter(('2018', 'food'): 2, ('2018', 'drink'): 1, ('2019', 'food'): 1, ('2019', 'car'): 1) 和列表理解将其转回平面列表并使用.items()进行写。

writerows

注意:对于Python 2,使用with open('output.csv', 'w') as csvfile: writer = csv.writer(csvfile) writer.writerow(('year', 'product', 'product_sum')) writer.writerows([(key[0], key[1], value) for key, value in c.items()]) 而不是iteritems()

以上是关于不使用熊猫分组的主要内容,如果未能解决你的问题,请参考以下文章

当日期不唯一时,在熊猫中按日期分组后计数观察值

使用熊猫按日期范围分组

将分组的聚合唯一列添加到熊猫数据框

使用 pd.Grouper 按月初分组的熊猫

使用转换的熊猫分组列表聚合失败并出现键错误

如何使用熊猫按 10 分钟对时间序列进行分组