计算嵌套列表中元素的出现次数,并进行计算
count the occurrences of elements in a nested list, and perform calculations
标题有点误导,因为我真的不知道如何描述这个
假设我有一个如下所示的嵌套列表:
a = [[1234,'1/8/2014'],[4123,'1/3/2014'],[5754,'1/12/2014'],[8548,'11/8/2014'],[9469,'11/9/2013'],[3564,'1/8/2013']]
在这个嵌套列表中,有 4 个列表是 2014 年,2 个列表是 2013 年。
我想获得每年的平均值。所以对于 2014 年,我想做,
(1234 + 4123 + 5754 + 8548) / 4
对于 2013 年,
(9469 + 3564) / 2
我需要获取每年出现的次数,因为我需要对每年的总和进行平均。
最后,我想要类似的东西,
new = [[4914.75, '2014'],[6516.5, '2013']]
请注意,日期不是“01/03/2014”,而是“1/3/2014”
如何做到这一点?
您可以使用 Pandas 来执行此操作。
import pandas as pd
a = [[1234,'1/8/2014'],[4123,'1/3/2014'],[5754,'1/12/2014'],[8548,'11/8/2014'],[9469,'11/9/2013'],[3564,'1/8/2013']]
df = pd.DataFrame(a)
df[1] = pd.to_datetime(df[1])
df = df.set_index(1)
df.groupby(df.index.year.astype(str)).mean()\
.reset_index().values.tolist()
输出:
[['2013', 6516.5], ['2014', 4914.75]]
上面的答案有效,如果你不习惯使用pandas,你可以参考这个。
a = [[1234,'1/8/2014'],[4123,'1/3/2014'],[5754,'1/12/2014'],[8548,'11/8/2014'],[9469,'11/9/2013'],[3564,'1/8/2013']]
data = {}
result = []
for item in a:
year = item[1].split('/')[-1]
data[year] = data.get(year, []) + [item[0]]
for key in data.keys():
items = data.get(key)
avg = sum(items)/len(items)
result.extend([key, avg])
print(result)
试试这个(它假定内部列表的长度始终为 2,并且第二个是日期):
from collections import defaultdict
cumulatives = defaultdict(int)
counts = defaultdict(int)
for (amount, dt) in a:
key = dt[-4:]
cumulatives[key] += amount
counts[key] += 1.0
output = [[cumulatives[key]/counts[key], key] for key in cumulatives.keys()]
print(output)
标题有点误导,因为我真的不知道如何描述这个
假设我有一个如下所示的嵌套列表:
a = [[1234,'1/8/2014'],[4123,'1/3/2014'],[5754,'1/12/2014'],[8548,'11/8/2014'],[9469,'11/9/2013'],[3564,'1/8/2013']]
在这个嵌套列表中,有 4 个列表是 2014 年,2 个列表是 2013 年。
我想获得每年的平均值。所以对于 2014 年,我想做,
(1234 + 4123 + 5754 + 8548) / 4
对于 2013 年,
(9469 + 3564) / 2
我需要获取每年出现的次数,因为我需要对每年的总和进行平均。 最后,我想要类似的东西,
new = [[4914.75, '2014'],[6516.5, '2013']]
请注意,日期不是“01/03/2014”,而是“1/3/2014”
如何做到这一点?
您可以使用 Pandas 来执行此操作。
import pandas as pd
a = [[1234,'1/8/2014'],[4123,'1/3/2014'],[5754,'1/12/2014'],[8548,'11/8/2014'],[9469,'11/9/2013'],[3564,'1/8/2013']]
df = pd.DataFrame(a)
df[1] = pd.to_datetime(df[1])
df = df.set_index(1)
df.groupby(df.index.year.astype(str)).mean()\
.reset_index().values.tolist()
输出:
[['2013', 6516.5], ['2014', 4914.75]]
上面的答案有效,如果你不习惯使用pandas,你可以参考这个。
a = [[1234,'1/8/2014'],[4123,'1/3/2014'],[5754,'1/12/2014'],[8548,'11/8/2014'],[9469,'11/9/2013'],[3564,'1/8/2013']]
data = {}
result = []
for item in a:
year = item[1].split('/')[-1]
data[year] = data.get(year, []) + [item[0]]
for key in data.keys():
items = data.get(key)
avg = sum(items)/len(items)
result.extend([key, avg])
print(result)
试试这个(它假定内部列表的长度始终为 2,并且第二个是日期):
from collections import defaultdict
cumulatives = defaultdict(int)
counts = defaultdict(int)
for (amount, dt) in a:
key = dt[-4:]
cumulatives[key] += amount
counts[key] += 1.0
output = [[cumulatives[key]/counts[key], key] for key in cumulatives.keys()]
print(output)