【问题标题】:adding data from different rows in a csv belonging to a common variable在属于公共变量的 csv 中添加来自不同行的数据
【发布时间】:2017-02-23 00:21:13
【问题描述】:

这是我的 csv excel 文件信息:

  Receipt merchant    Address      Date    Time    Total price
    25007   A      ABC pte ltd   3/7/2016   10:40   12.30
    25008   A      ABC ptd ltd   3/7/2016   11.30   6.70
    25009   B      CCC ptd ltd   4/7/2016   07.35   23.40
    25010   A      ABC pte ltd   4/7/2016   12:40   9.90

如何才能将每行的“总价格”加在一起,前提是它们属于相同的“商家”、“日期”和“时间”,然后将它们组合在一个列表或字典中,例如:{[ 'A','3/7/2016', '19.0'], ['A',4/7/2016, '9.90'],..} 我以前的代码做了我想要的,只是我缺少计算每个相同日期和商家的总价格的代码。

from collections import defaultdict
from csv import reader
with open("assignment_info.csv") as f:
    next(f) 
    group_dict = defaultdict(list)
    for rec, name, _, dte, time, price in reader(f):
        group_dict[name, dte].extend(time)
    for v in group_dict.values():v.sort()    

from  pprint import pprint as pp
print 'Sales tracker:'
pp(dict(group_dict))

【问题讨论】:

  • 您是按商家和日期分组,还是按商家、日期和时间分组?在您的示例中,您正在做的是前者。
  • 我拥有的代码是将不同的时间分组到同一个商家和日期。我想做的是添加属于同一日期和商家的总价格,然后将其分组到其商家和日期。
  • 考虑迁移到普通数据库

标签: python csv pandas design-patterns pandas-groupby


【解决方案1】:

正如另一个答案所指出的,pandas 是用于此类数据操作的出色库。我的回答不会使用pandas

几个问题:

  • 在您的问题描述中,您声明要按 三个 列进行分组,但在您的示例情况下,您仅按两个分组。由于前者更有意义,我只按namedate 分组
  • 您正在循环和排序每个值,但对于我来说,我无法弄清楚为什么。
  • 您将defaultdict 的默认类型声明为一个列表,然后将extend 声明为一个字符串,这最终会为您提供一个(排序的!)字符列表。你真的不想这样做。
  • 您的示例使用集合的语法:{ [a,b,c], [d,e,f] },但 dict 的语法更有意义:{ (a, b): c, }。我已将输出更改为后者。

这是一个工作示例:

from collections import defaultdict
from csv import reader

with open("assignment_info.csv") as f:
    next(f) 
    group_dict = defaultdict(float)
    for rec, name, _, dte, time, price in reader(f):
        group_dict[name, dte] += float(price)

group_dict 现在是:

{('A', '3/7/2016'): 19.0, ('A', '4/7/2016'): 9.9, ('B', '4/7/2016'): 23.4}

我删除了您的示例中没有的额外列:这是我使用的文件:

收据、商户、地址、日期、时间、总价
25007,A,ABC pte ltd,3/7/2016,10:40,12.30
25008,A,ABC ptd ltd,3/7/2016,11.30,6.70
25009,B,CCC ptd ltd,4/7/2016,07.35,23.40
25010,A,ABC pte ltd,4/7/2016,12:40,9.90

【讨论】:

  • 一切都很好,只是我的输出必须包括每组商家的销售时间和日期,例如 {('A', '3/7/2016'): 19.0, 10:30,11:30} 请建议
【解决方案2】:
import pandas as pd

df = pd.read_csv('assignment_info.csv')
df = df.groupby(['merchant', 'Date', 'Time']).sum().reset_index()
df

【讨论】:

  • 希望能找到没有 pandas 模块的替代方法,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
相关资源
最近更新 更多