Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python为CSV中的每个人重置计数器_Python_Csv - Fatal编程技术网

使用Python为CSV中的每个人重置计数器

使用Python为CSV中的每个人重置计数器,python,csv,Python,Csv,我对编程比较陌生,一直在尝试学习python。我有一个问题,我花了几个小时在里面,似乎不知道如何解决它 我有一个CSV文件,其中包含一些数据,我想通过数据循环并创建一个字典,其中键是人,值是一个字典,其中键是一个项,值是该项的数量。我还想排除一些我不关心的数据。在这个例子中,我不在乎他们有多少菠萝 CSV数据示例: Name Fruit Bob, Apples Bob, Pineapple Bob, Apples Bob, Oranges Bob, Oranges Bob, Oranges Bo

我对编程比较陌生,一直在尝试学习python。我有一个问题,我花了几个小时在里面,似乎不知道如何解决它

我有一个CSV文件,其中包含一些数据,我想通过数据循环并创建一个字典,其中键是人,值是一个字典,其中键是一个项,值是该项的数量。我还想排除一些我不关心的数据。在这个例子中,我不在乎他们有多少菠萝

CSV数据示例:

Name Fruit Bob, Apples Bob, Pineapple Bob, Apples Bob, Oranges Bob, Oranges Bob, Oranges Bob, Kiwi Kate, Oranges Kate, Pineapple Kate, Oranges Kate, Apples Mary, Kiwi Mary, Pineapple 我似乎想不出一个方法来重置每个人的计数器,并且在第一个人之后每个人的计数都是错误的,因为它添加的是整个列表,而不是每个人

实际结果:
{鲍勃:{苹果:2,桔子:3,猕猴桃:1}凯特:{桔子:5,苹果:3}玛丽:{猕猴桃:2,桔子:5,苹果:3}


我可能连正确的方法都没有。打开了解如何解决此问题或更好的解决方法

如果您可以假设CSV文件按名称排序(如您给出的示例中所示),则每次遇到新名称时都可以重置
结果列表

prevPerson = ''
for row in readCSV:
    person = row[0]
    fruit = row[1]
    if (prevPerson != person):
        fruitlist = []
    prevPerson = person
    if fruit in fruitToAnalyze:
        fruitlist.append(fruit)
        countedfruitlist = Counter(fruitlist)
        final[person] = countedfruitlist
否则,您将为每个人保留一个
结果列表
数组,并且只有在完成后,才将其转到Counter

for row in readCSV:
    person = row[0]
    fruit = row[1]
    if fruit in fruitToAnalyze:
        if (person not in final):
            final[person] = []
        final[person].append(fruit)
... # finish code
for person in final.keys():
    final[person] = Counter(final[person])

我不确定你是否真的需要柜台。您可以简单地初始化默认字典

注意:此方法不假设您的文件中没有人相互混合

import csv

fruitToAnalyze = {'Apples','Oranges','Kiwi'}
final = {}

with open("data.csv") as csvfile:
    readCSV = csv.reader(csvfile, delimiter=',')
    next(csvfile)
    for row in readCSV:
        person = row[0]
        # Initializes only one person dict
        if person not in final:
            final[person] = {f: 0 for f in fruitToAnalyze}  
        fruit_counter = final[person]
        fruit = row[1].strip()
        if fruit in fruitToAnalyze:
            fruit_counter[fruit] += 1

输出
{'Bob':{'Oranges':3,'Kiwi':1,'Apples':2},'Kate':{'Oranges':2,'Kiwi':0,'Apples':1,'Kiwi':1,'Apples':0}

效果很好,但是你能解释一下fruitToAnalyze}行中的{f:0代表f吗。不知道那是干什么的,听懂了。你的第一个例子是我想我必须做的,但不知道如何做。但是第二个更好。虽然这些数据是好的、整洁的、有序的,但我喜欢这样的想法:如果数据不有序,就能够处理它。
import csv

fruitToAnalyze = {'Apples','Oranges','Kiwi'}
final = {}

with open("data.csv") as csvfile:
    readCSV = csv.reader(csvfile, delimiter=',')
    next(csvfile)
    for row in readCSV:
        person = row[0]
        # Initializes only one person dict
        if person not in final:
            final[person] = {f: 0 for f in fruitToAnalyze}  
        fruit_counter = final[person]
        fruit = row[1].strip()
        if fruit in fruitToAnalyze:
            fruit_counter[fruit] += 1