如何在不将其称为数据框的情况下对 python 中的列求和

How to sum a column in python without calling it a dataframe

我有输出到 csv 文件的数据:

url  date          id    hits
a    2017-01-01    123     2
a    2017-01-01    123     2
b    2017-01-01    45      25
c    2017-01-01    123     5
d    2017-01-03    678     1
d    2017-01-03    678     7     

依此类推,其中 hits 是 id 值在每个 url 的给定日期出现的次数。 (即:ID 号 123 在 2017-01-01 出现 2 次 url "a"。

我需要在点击后创建另一列,称为 "total hits",它捕获给定 url、日期和 ID 值的每天点击总数。所以输出看起来像这样..

url  date          id    hits   total_hits
a    2017-01-01    123     2         4
a    2017-01-01    123     2         4
b    2017-01-01    45      25        25
c    2017-01-01    123     5         5
d    2017-01-03    678     1         8
d    2017-01-03    678     7         8  

如果不使用 pandas 或 numpy 就可以解决这个问题,那就太棒了。

请帮忙!提前致谢。

标准 python 安装简单。

  • 使用逐行读取和拆分来读取和解析文件
  • 创建一个 collections.defaultdict(int) 来计算 url/date/id 三元组
  • 的出现次数
  • 在额外的列中添加信息
  • 回写(我选择csv)

像这样:

import collections,csv

d = collections.defaultdict(int)

rows = []

with open("input.csv") as f:
    title = next(f).split()  # skip title
    for line in f:
        toks = line.split()
        d[toks[0],toks[1],toks[2]] += int(toks[3])
        rows.append(toks)

# complete data
for row in rows:
    row.append(d[row[0],row[1],row[2]])
title.append("total_hits")


with open("out.csv","w",newline="") as f:
    cw = csv.writer(f)
    cw.writerow(title)
    cw.writerows(rows)

这是输出文件:

url,date,id,hits,total_hits
a,2017-01-01,123,2,4
a,2017-01-01,123,2,4
b,2017-01-01,45,25,25
c,2017-01-01,123,5,5
d,2017-01-03,678,1,8
d,2017-01-03,678,7,8