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}}}