【问题标题】:python csv list compare and additionpython csv列表比较和加法
【发布时间】:2016-04-25 14:07:13
【问题描述】:

解析和添加客户端数据

Data:
('Client 1', '13.2')
('Client 1', '22.4')
('Client 1', '1.2')
('Client 2', '3.4')
('Client 3', '12.3')
('Client 3', '3.221')
('Client 4', '234.44')

尝试编写正确的循环并添加功能以获得正确的输出。

目标结果:

客户端 1:36.8
客户端 2:3.4
客户 3:15.521
客户端 4:234.44

这是我最终正确列出数据的代码。我从这里去哪里得到结果。我尝试了许多不同的循环都没有成功。

import csv

with open('clientdata.csv') as csvfile:
    reader = csv.DictReader(csvfile)
    numbers = []
    for row in reader:
       print(row['Client Name'], row['Earnings'])

【问题讨论】:

  • 可能使用pandas模块和group_bysum
  • 或使用字典numbers[ row['Client Name'] ] += row['Earnings']对值求和
  • 你的数据文件中真的有括号吗?即,文件中是('Client 1', '13.2') 还是'Client 1', '13.2'

标签: python parsing csv addition


【解决方案1】:

您可以通过使用格式字符串(%.2f 将有 2 个小数位)和记录谁赚多少的字典来解决它。

clients = {}
with open('clientdata.csv') as csvfile:
    reader = csv.DictReader(csvfile)
    numbers = []
    for row in reader:
       name = row['Client Name']
       earnings = float(row['Earnings'])
       if name in clients:
           clients[name] += earnings
       else:
           clients[name] = earnings
    for client in sorted(clients):
          print("%s:%.2f" % (client, clients[client]))

【讨论】:

  • 这很好用!客户的订单在此过程中被破坏。您如何列出这些客户 A-Z?
  • 问题是字典不保持秩序。因此,我们需要对客户名称进行排序。我已经调整了解决方案以合并正在排序的客户端。
【解决方案2】:

您应该创建一个包含所有客户端的字典,然后检查客户端是否已经在目录中。如果客户不是,那么将他们与他们的收入一起添加。如果他们在其中,那么只需将下一个收入添加到他们现有的收入中。

这是我将如何进行此操作的代码。希望这会有所帮助:

clientDirectory = {}
for row in reader:
    if row['Client Name'] not in clientDirectory:
        clientDirectory[row['Client Name']] = float(row['Earnings'])
    else:
        [row['Client Name']] += float(row['Earnings'])

for key in clientDirectory.keys():
    print("%s %f" %(key, clientDirectory[key]))

【讨论】:

  • 我认为 clientDirectory[key] 是一个浮点数,打印时应该使用 %f 而不是 %s。
【解决方案3】:

您可以使用字典添加值

with open('clientdata.csv') as csvfile:
    reader = csv.DictReader(csvfile)
    results = {}

    # adding

    for row in reader:

       # default value for new client
       if row['Client Name'] not in results:
          results[row['Client Name']] = 0

       # add value
       results[row['Client Name']] += float(row['Earnings'])

    # showing

    for name, value in results.items():
        print("%s: %s" % (name,value))

但这可能是一个问题 - 字典不必保持顺序,您可以以不同的顺序查看结果。

【讨论】:

  • 这不会导致您的打印语句出现问题,因为值将是一个浮点数并且您的格式字符串是字符串类型吗?
  • python 应该将浮点数转换为字符串 - 但是使用例如 %.3f 如果我需要它们,我可以获得四舍五入的结果。
  • 当然你可以使用有序字典(来自集合)来保持顺序。
【解决方案4】:

假设你有一个像这样的数据文件:

$ cat /tmp/data.csv
'Client 1', '13.2'
'Client 1', '22.4'
'Client 1', '1.2'
'Client 2', '3.4'
'Client 3', '12.3'
'Client 3', '3.221'
'Client 4', '234.44'

您可以使用defaultdict 将文件中的浮点值相加:

from collections import defaultdict
import csv

dd=defaultdict(float)

with open('/tmp/data.csv') as data:
    for row in csv.reader(data, quotechar="'", skipinitialspace=True):
        dd[row[0]]+=float(row[1])

print '\n'.join(["{}: {}".format(k, dd[k]) for k in sorted(dd)])      

打印:

Client 1: 36.8
Client 2: 3.4
Client 3: 15.521
Client 4: 234.44

(我使用的排序仅适用于客户端 1 - 客户端 9;之后您需要一个 natural sort 方法...)

【讨论】:

    【解决方案5】:
    $ cat test.csv
    Client 1, 13.2
    Client 1, 22.4
    Client 1, 1.2
    Client 2, 3.4
    Client 3, 12.3
    Client 3, 3.221
    Client 4, 234.44
    

    然后在 Python 中:

    from odo import odo
    from pandas import DataFrame
    
    clientDF = odo('test.csv', DataFrame)
    print clientDF.groupby(['0']).sum()
    

    【讨论】:

      猜你喜欢
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多