2017-05-29 56 views
-1

所以我有一个这样的名单:转换列表汇总列表

date, type 
29-5-2017, x 
30-5-2017, x 
31-5-2017, y 
1-6-2017, z 
2-6-2017, z 
3-6-2017, y 
28-5-2017, y 
29-5-2017, z 
30-5-2017, z 
31-5-2017, y 
1-6-2017, z 
2-6-2017, z 
3-6-2017, x 
29-5-2017, x 
30-5-2017, z 
31-5-2017, z 
1-6-2017, y 
2-6-2017, x 
3-6-2017, z 
4-6-2017, y 

我将如何创建这个列表的汇总版本?因此,我只收集每个日期一次,并查看给定日期中每种类型的数量。

像这样:

date, no._of_x, no._of_y, no._of_z 
28-5-2017, 0, 1, 0 
29-5-2017, 2, 0, 1 
30-5-2017, 1, 0, 2 
31-5-2017, 0, 2, 1 
1-6-2017, 0, 1, 2 
2-6-2017, 1, 0, 2 
3-6-2017, 1, 1, 1 
4-6-2017, 0, 1, 0 
+2

而你的问题是?你有什么问题,你尝试过哪些方法无效? –

+1

你可以在做/试图做的时候做几乎所有事情,而不是要求 –

+0

@KevinSijbers如何将上面的列表转换为如下所示的更短的列表。最终我想创建一个条形图,以便我可以在每天看到x,y,z有多少。 –

回答

0

假设你的名单列表包含按日期日期字符串和的xyz,您可以第一组的列表中的每个子列表清单。只需创建一个字典或collections.defaultdict,将日期映射到x/z/y列表。

dates = collections.defaultdict(list) 
for date, xyz in data: 
    dates[date].append(xyz) 

接下来,您可以创建另一个字典,每个那些X/Y/Z列表映射到Counter字典:

counts = {date: collections.Counter(xyz) for date, xyz in dates.items()} 

之后,counts是这样的:

{'2-6-2017,': Counter({'z': 2, 'x': 1}), 
'29-5-2017,': Counter({'x': 2, 'z': 1}), 
'3-6-2017,': Counter({'x': 1, 'y': 1, 'z': 1}), 
'28-5-2017,': Counter({'y': 1}), 
'1-6-2017,': Counter({'z': 2, 'y': 1}), 
'4-6-2017,': Counter({'y': 1}), 
'31-5-2017,': Counter({'y': 2, 'z': 1}), 
'30-5-2017,': Counter({'z': 2, 'x': 1})} 
+0

太棒了!谢谢。有没有一种方法来格式化?所以它总是x,然后y,然后z。如果没有x,y或z,则记下0。 像这样: '1-6-2017,':Counter({'x':0,'y':1,'z':2}), '4-6-2017,':Counter ({'x':0,'y':1,'z':0}), 对不起,对于这些问题,我是一个非常新的Python。 –