我有一个包含名称,年份,金额和结果的数据列表。我想计算每年的总赢额和总亏损。 (最好对初学者使用列表功能)谢谢
我尝试使用dictionay,但似乎增加了很多复杂性,并且一直在显示错误。
>>> my_list = [ ['a', '2013', '10.22', 'won'], ['b', '2012', '11.23', 'won'], ['c', '2013', '12.62', 'lost']]
>>> headers = ['name', 'year', 'amount', 'result']
>>> my_dict = {k: [x [i] for x in my_list] for i, k in enumerate(headers)}
我希望返回的格式为
Year Total Won Total Lost
2012 11.23 0
2013 10.22 12.62
答案 0 :(得分:1)
如果您足够习惯使用pandas,则可以在数据上创建pivot table。我假设结果表就是您要显示的内容。
import pandas as pd
headers = ['name', 'year', 'amount', 'result']
my_list = [ ['a', '2013', '10.22', 'won'],
['b', '2012', '11.23', 'won'],
['c', '2013', '12.62', 'lost']]
df = pd.DataFrame(my_list, columns=headers)
df.amount = pd.to_numeric(df.amount) # makes amount numeric
df2 = pd.pivot_table(df, index='year', columns='result', values='amount', aggfunc=sum)
# result lost won
# year
# 2012 NaN 11.23
# 2013 12.62 10.22
要将NaN
更改为0
df2.fillna(0, inplace=True)
从那里您可以玩得开心,做一些更好的事情,例如计算净变化。
df2['net'] = df2.won - df2.lost
# result lost won net
# year
# 2012 0.00 11.23 11.23
# 2013 12.62 10.22 -2.40
答案 1 :(得分:1)
我建议您编写一些代码,而不是理解字典(您的方法)。该解决方案可以满足您的需求。
from collections import defaultdict
d = defaultdict(dict)
my_list = [ ['a', '2013', '10.22', 'won'], ['b', '2012', '11.23', 'won'], ['c', '2013', '12.62', 'lost']]
for rec in my_list:
if rec[3] in d[rec[1]]:
d[rec[1]][rec[3]] += float(rec[2])
else:
d[rec[1]][rec[3]] = float(rec[2])
print('Year', "won", " lost")
for year in sorted(d):
print(year, '\t'.join([str(d[year].get('won', '0')), \
str(d[year].get('lost', '0'))]))
此打印:
Year won lost
2012 11.23 0
2013 10.22 12.62
答案 2 :(得分:1)
假设您2012年的预期输出是一个错别字(如数据集所示,您打算显示11.23作为总赢额),则可以使用itertools.groupby
和sum
来总结总赢取/失去了一年。您可以根据需要修改输出格式,但这应该可以帮助您。
from itertools import groupby
from operator import itemgetter
results = [['a', '2013', '10.22', 'won'], ['b', '2012', '11.23', 'won'], ['c', '2013', '12.62', 'lost']]
for year, values in groupby(sorted(results, key=itemgetter(1)), key=itemgetter(1)):
values = list(values)
won = sum(float(v[2]) for v in values if v[3] == 'won')
lost = sum(float(v[2]) for v in values if v[3] == 'lost')
print(f'Year: {year} Total Won: {won} Total Lost: {lost}')
# Year: 2012 Total Won: 11.23 Total Lost: 0
# Year: 2013 Total Won: 10.22 Total Lost: 12.62