Python 将列表中的项目分组并计算总和
我有一个每周数字的列表,需要按月获得分组总数 下面的代码完成了这项工作,但是应该有一种更为python的方法来使用标准库。 下面代码的缺点是列表需要按顺序排序Python 将列表中的项目分组并计算总和,python,itertools,Python,Itertools,我有一个每周数字的列表,需要按月获得分组总数 下面的代码完成了这项工作,但是应该有一种更为python的方法来使用标准库。 下面代码的缺点是列表需要按顺序排序 #Test data (not sorted) sum_weekly=[('2020/01/05', 59), ('2020/01/19', 88), ('2020/01/26', 95), ('2020/02/02', 89), ('2020/02/09', 113), ('2020/02/16', 90), ('2020/02/23
#Test data (not sorted)
sum_weekly=[('2020/01/05', 59), ('2020/01/19', 88), ('2020/01/26', 95), ('2020/02/02', 89),
('2020/02/09', 113), ('2020/02/16', 90), ('2020/02/23', 68), ('2020/03/01', 74), ('2020/03/08', 85),
('2020/04/19', 6), ('2020/04/26', 5), ('2020/05/03', 14),
('2020/05/10', 5), ('2020/05/17', 20), ('2020/05/24', 28),('2020/03/15', 56), ('2020/03/29', 5), ('2020/04/12', 2),]
month = sum_weekly[0][0].split('/')[1]
count=0
out=[]
for item in sum_weekly:
m_sel = item[0].split('/')[1]
if m_sel!=month:
out.append((month, count))
count=item[1]
else:
count+=item[1]
month = m_sel
out.append((month, count))
# monthly sums output as ('01', 242), ('02', 360), ('03', 220), ('04', 13), ('05', 67)
print (out)
您可以使用defaultdict来存储结果,而不是列表。字典的键是月份,您可以简单地使用相同的月份键添加值
可能的实施:
测试数据
从集合导入defaultdict
每周总和=['2020/01/05',59',2020/01/19',88',2020/01/26',95',2020/02/02',89,
'2020/02/09', 113, '2020/02/16', 90, '2020/02/23', 68, '2020/03/01', 74, '2020/03/08', 85,
'2020/03/15', 56, '2020/03/29', 5, '2020/04/12', 2, '2020/04/19', 6, '2020/04/26', 5,
'2020/05/03', 14,
'2020/05/10', 5, '2020/05/17', 20, '2020/05/24', 28]
结果=默认措辞
对于日期,每周计算总和:用于拆包以使其更清楚
月=日期。拆分“/”[1]
因为如果密钥不存在,我们就使用defaultdict
密钥的条目将被创建并初始化为零
结果[月份]+=计数
打印结果
您可以使用defaultdict来存储结果,而不是列表。字典的键是月份,您可以简单地使用相同的月份键添加值
可能的实施:
测试数据
从集合导入defaultdict
每周总和=['2020/01/05',59',2020/01/19',88',2020/01/26',95',2020/02/02',89,
'2020/02/09', 113, '2020/02/16', 90, '2020/02/23', 68, '2020/03/01', 74, '2020/03/08', 85,
'2020/03/15', 56, '2020/03/29', 5, '2020/04/12', 2, '2020/04/19', 6, '2020/04/26', 5,
'2020/05/03', 14,
'2020/05/10', 5, '2020/05/17', 20, '2020/05/24', 28]
结果=默认措辞
对于日期,每周计算总和:用于拆包以使其更清楚
月=日期。拆分“/”[1]
因为如果密钥不存在,我们就使用defaultdict
密钥的条目将被创建并初始化为零
结果[月份]+=计数
打印结果
您可以使用itertools.groupby它是标准库的一部分-它的功能与您在后台所做的差不多,它将键函数提供相同输出的元素序列组合在一起。它可以如下所示:
import itertools
def select_month(item):
return item[0].split('/')[1]
def get_value(item):
return item[1]
result = [(month, sum(map(get_value, group)))
for month, group in itertools.groupby(sorted(sum_weekly), select_month)]
print(result)
您可以使用itertools.groupby它是标准库的一部分-它的功能与您在后台所做的差不多,它将键函数提供相同输出的元素序列组合在一起。它可以如下所示:
import itertools
def select_month(item):
return item[0].split('/')[1]
def get_value(item):
return item[1]
result = [(month, sum(map(get_value, group)))
for month, group in itertools.groupby(sorted(sum_weekly), select_month)]
print(result)
简明扼要,但可能没有那么像蟒蛇:
import calendar, functools, collections
{calendar.month_name[i]: val for i, val in functools.reduce(lambda a, b: a + b, [collections.Counter({datetime.datetime.strptime(time, '%Y/%m/%d').month: val}) for time, val in sum_weekly]).items()}
简明扼要,但可能没有那么像蟒蛇:
import calendar, functools, collections
{calendar.month_name[i]: val for i, val in functools.reduce(lambda a, b: a + b, [collections.Counter({datetime.datetime.strptime(time, '%Y/%m/%d').month: val}) for time, val in sum_weekly]).items()}
一种使用pyspark的方法
from pyspark import SparkContext
sc = SparkContext()
l = sc.parallelize(sum_weekly)
r = l.map(lambda x: (x[0].split("/")[1], x[1])).reduceByKey(lambda p, q: (p + q)).collect()
print(r) #[('04', 13), ('02', 360), ('01', 242), ('03', 220), ('05', 67)]
一种使用pyspark的方法
from pyspark import SparkContext
sc = SparkContext()
l = sc.parallelize(sum_weekly)
r = l.map(lambda x: (x[0].split("/")[1], x[1])).reduceByKey(lambda p, q: (p + q)).collect()
print(r) #[('04', 13), ('02', 360), ('01', 242), ('03', 220), ('05', 67)]
您可以通过一个数据帧来实现这一点。首先,隔离月份,然后使用groupby.sum
import pandas as pd
sum_weekly=[('2020/01/05', 59), ('2020/01/19', 88), ('2020/01/26', 95), ('2020/02/02', 89), ('2020/02/09', 113), ('2020/02/16', 90), ('2020/02/23', 68), ('2020/03/01', 74), ('2020/03/08', 85), ('2020/04/19', 6), ('2020/04/26', 5), ('2020/05/03', 14), ('2020/05/10', 5), ('2020/05/17', 20), ('2020/05/24', 28),('2020/03/15', 56), ('2020/03/29', 5), ('2020/04/12', 2)]
df= pd.DataFrame(sum_weekly)
df.columns=['Date','Sum']
df['Month'] = df['Date'].str.split('/').str[1]
print(df.groupby('Month').sum())
您可以通过一个数据帧来实现这一点。首先,隔离月份,然后使用groupby.sum
import pandas as pd
sum_weekly=[('2020/01/05', 59), ('2020/01/19', 88), ('2020/01/26', 95), ('2020/02/02', 89), ('2020/02/09', 113), ('2020/02/16', 90), ('2020/02/23', 68), ('2020/03/01', 74), ('2020/03/08', 85), ('2020/04/19', 6), ('2020/04/26', 5), ('2020/05/03', 14), ('2020/05/10', 5), ('2020/05/17', 20), ('2020/05/24', 28),('2020/03/15', 56), ('2020/03/29', 5), ('2020/04/12', 2)]
df= pd.DataFrame(sum_weekly)
df.columns=['Date','Sum']
df['Month'] = df['Date'].str.split('/').str[1]
print(df.groupby('Month').sum())
只是为了确保:您想按日期分组,这是日期num tuple的第一个元素,并计算每个日期组的数字之和,这是日期num tuple的第二个元素?@Liorr tuple的第一个元素表示月份。04,13在April中表示13只是为了确保:您想按日期分组,这是日期num元组的第一个元素,并计算每个日期组的数字之和,这是日期num元组的第二个元素?@Liorr元组的第一个元素表示月份。04,13表示4月13日