Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.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 不带panda的CSV文件中重复键的求和值_Python - Fatal编程技术网

Python 不带panda的CSV文件中重复键的求和值

Python 不带panda的CSV文件中重复键的求和值,python,Python,我有一个大数据集,如下所示 参与方、cp、限定符、金额 ABC、DEF、谷歌2100 ABC、DEF、谷歌2200 GHI、JKL、FACEBOOK_1500 GHI,JKL,FACEBOOK_1,-600 我想输出: ABC、DEF、谷歌、300 GHI,JKL,FACEBOOK,-100 以下是迄今为止我的python代码: headers=[“估价日期”、“参与方集团名称”、“类型”、“参与方名称”、“cp集团名称”、“cp集团名称”、“限定词”、“金额”] 数据={} 打开(t1fi

我有一个大数据集,如下所示

参与方、cp、限定符、金额
ABC、DEF、谷歌2100
ABC、DEF、谷歌2200
GHI、JKL、FACEBOOK_1500
GHI,JKL,FACEBOOK_1,-600
我想输出:

ABC、DEF、谷歌、300
GHI,JKL,FACEBOOK,-100
以下是迄今为止我的python代码:

headers=[“估价日期”、“参与方集团名称”、“类型”、“参与方名称”、“cp集团名称”、“cp集团名称”、“限定词”、“金额”]
数据={}
打开(t1file,'rb')作为f:
读卡器=csv。读卡器(f)
headers=reader.next()
对于读取器中的行:
party=行[headers.index('party')]
cp=行[headers.index('cp')]
限定符=行[headers.index('qualifier')]
金额=行[headers.index('amount')]
如果行[headers.index('type')]=“股权”:
新的\u限定符=限定符。拆分(“\u”)[0]
如果参与方在data.keys()中:
如果cp位于data.keys()中:
如果data.keys()中有新的\u限定符:
数据[缔约方][cp][new_限定符]+=浮动(金额)
其他:
数据[缔约方][cp][限定词][amount]=数据[缔约方][cp][new_限定词][amount]
其他:
数据[cp]=cp
其他:
数据[参与方]=参与方
运行上述代码时,出现以下错误:

data[party][cp][qualifier][amount]=data[party][cp][new_qualifier][amount]
TypeError:字符串索引必须是整数,而不是str
对python非常生疏如果这是明显的讣告,请道歉,但是对于我做错了什么有什么见解吗? 谢谢

您可以使用删除多个列的副本,并将其与
pandas.groupby()
&
sum
组合以获得所需的结果

>>>import pandas as pd
>>>#read file using pandas.read_csv()
>>>df
  party   cp   qualifier  amount
0   ABC  DEF    GOOGLE_2     100
1   ABC  DEF    GOOGLE_2     200
2   GHI  JKL  FACEBOOK_1     500
3   GHI  JKL  FACEBOOK_1    -600

>>>df['Total'] = df.groupby(['party','cp','qualifier'])['amount'].transform('sum')
>>>print(df.drop_duplicates(subset=['party','cp','qualifier'], keep='last'))

  party   cp   qualifier  amount  Total
1   ABC  DEF    GOOGLE_2     200    300
3   GHI  JKL  FACEBOOK_1    -600   -100

您可以这样做:

from csv import DictReader, DictWriter

map_dic = dict()
with open('test1.csv', 'r') as fr:
    csv_reader = DictReader(fr, delimiter=',')
    for line in csv_reader:
        key = '{}_{}_{}'.format(line['party'], line['cp'], line['qualifier'])
        if key not in map_dic.keys():
            map_dic[key] = {'party': line['party'], 'cp': line['cp'], 'qualifier': line['qualifier'], 'amount': int(line['amount'])}
        else:
            map_dic[key]['amount'] = map_dic[key]['amount'] + int(line['amount'])

with open('test2.csv', 'w') as csvfile:
    writer = DictWriter(csvfile, fieldnames=['party', 'cp', 'qualifier', 'amount'])
    writer.writeheader()
    for key, data in map_dic.items():
        writer.writerow(data)
下面

del-me.csv

party,cp,qualifier,amount
ABC,DEF,GOOGLE_2,100
ABC,DEF,GOOGLE_2,200
GHI,JKL,FACEBOOK_1,500
GHI,JKL,FACEBOOK_1,-600
out.csv

ABC,DEF,GOOGLE,300
GHI,JKL,FACEBOOK,-100

为了简化事情,您可以只为dict使用一个键,它由给定行的标识部分组成

您可能必须像以前一样,按标题名称提取值。以下内容基于指定的输入。用于在末尾拆分字符串一次,以便使用
参与方、cp、限定符组合作为键并提取金额

def sumUp():
    d = {}
    with open(t1file,'rb') as f:
        for line in f:
            if 'party' in line:
                continue  # skip header
            key, value = line.rsplit(',', 1)  # split once at the end
            d[key] = d[key] + int(value) if key in d else int(value)

您已经有了足够的答案,但让我更正您自己的代码,以帮助您得出答案并理解原始问题:

import csv as csv
headers = ["valuation_date","party_group_name","party_name","cp_group_name","cp_name","qualifier","amount"]

data = {}
with open('test_data.csv','rt', encoding='utf-8') as f:
    reader = csv.reader(f)
    headers = next(reader)
    for row in reader:
            party = row[headers.index('party')]
            cp = row[headers.index('cp')]
            qualifier = row[headers.index('qualifier')]
            amount = row[headers.index('amount')]
            if row[headers.index('type')] == "Equity":
                    new_qualifier = qualifier.split("_")[0]
                    if party in data.keys():
                            cp_ = data[party]
                            if cp in cp_.keys():
                                    qualifier_ = data[party][cp]
                                    if new_qualifier in qualifier_.keys():
                                            data[party][cp][new_qualifier] += float(amount)
                                    else:
                                            data[party][cp][qualifier][amount] = {}
                            else:
                                    data[cp] = {}
                    else:
                             data[party] = {}
                             data[party][cp] = {}
                             data[party][cp][qualifier.split("_")[0]] = float(amount)
print(data)
这给你

{'ABC': {'DEF': {'GOOGLE': 300.0}}, 'GHI': {'JKL': {'FACEBOOK': -100.0}}}

问题是如何填充词典以及如何访问词典。

对于代码行
if行[headers.index('type')]=“Equity”:
文件中
type
在哪里?现在添加,我必须删除一些本练习不需要的标题。这没有帮助。您看到您读取了文件并更改了
标题
。它应该在你的csv文件中。无论我使用哪个标题,我都会收到相同的错误消息。谢谢!我对以下行amount=int(字段[amount])有问题。->ValueError:基数为10'-106369.88的int()的文本无效。试图通过重写为float(字段[AMOUNT])来解决此问题,但未成功。请添加导致此问题的确切行<代码>浮点('-106369.88')
应该可以工作了,谢谢!嗯,虽然这很奇怪,但我在尝试运行上面的代码时遇到了一个关键错误
data[party][cp][new_qualifier][amount]={}KeyError:'EWZ UP'
谢谢!我认为这是最适合我的片段。我可以问一下,您如何写入一个文件,以便只写入一次头,然后再写入相应的值?
{'ABC': {'DEF': {'GOOGLE': 300.0}}, 'GHI': {'JKL': {'FACEBOOK': -100.0}}}