2014-02-17 93 views
0

我在Excel中有两列。日期和温度。他们是这样的:在Python中删除重复的值

date    temp 
20130102   34.20 
20130102   34.42 
20130102   34.23 
20130102   34.12 
20130102   34.84 
20130103   34.48 
20130103   34.42 
20130103   33.77 
20130103   33.62 
20130103   33.94 
20130103   33.45 

当我使用numpy的解压缩到蟒蛇,我得到2个数组是这样的:

date = [20130102,20130102,20130102,20130102,20130102,20130103,20130103,20130103,20130103] 
temp = [34.20,34.42,34.23.....,33.45] 

如何转换成1个阵列阵列这个由1个日期相结合该日期的所有相应临时工。

dataarray = [[20130102,34.20,34.42,34.23,34.12,34.84],[20130103,34.48,34.42,33.77,33.62,33.94,33.45]] 
+0

你不是已经得到了答案,这在[您刚才的问题(HTTP: //stackoverflow.com/questions/21839541/extract-information-from-excel-into-python-2d-array)?如果问题在于你获得了列表列表而不是2D NumPy数组列表......那么,当然你已经做到了。 NumPy数组是正方形的,它不能锯齿状(不同行的长度不同)。 – abarnert

+0

另外:我不清楚这是一种特别有用的数据格式。如果你想用日常的温度做点事情(比如获取关于它们的统计数据等等),那么我认为你会以错误的方式去做。 – DSM

回答

2

为了让您指定(名单列表)的确切格式,我会使用itertools.groupby然后到几个列表内涵解压组发电机:

import itertools 
groups = itertools.groupby(zip(date, temp), lambda dv:dv[0]) 
list_of_lists = [[d] + [v[1] for v in values] for d, values in groups] 

我假设的基础上,你的榜样,你的数据是有序提供。如果没有,groupby函数将不会做你需要它做的事情,你最好用字典(见下文)。


但我的猜测是,如果你想真正做任何这个数据你解压后,这将是有它的日期一本字典更方便,在这种情况下你我想要在Joran's answer中使用defaultdict策略。

+1

在他[他的上一个问题](http://stackoverflow.com/questions/21839541/extract-information-from-excel-into-python-2d-array)他特别说他想要这个清单列表格式时我建议一个字典会更好。当然,他也在那里得到了相应的答案后问这个问题,所以...谁知道他在做什么。 – abarnert

+0

想通了我的问题。感谢您提供完美的答案。这正是我所寻找的 – user1681664

+0

@ user1681664看起来你的输入数据包含一堆空白行,也许?当你从任何数据源读取数据时(例如,如果你正在从一个文件中读取数据,“对于文件中的行:if line.strip():continue'),我会将它们修剪掉。这样你就不会浪费时间处理垃圾数据。 –

1

尝试一个字典,其中的关键是日期和结果是一个数组,您追加到。所以你只需通过pair来解析并调用dataArray [date [i]]。append(temp [i])等。不过,如果密钥当前为空,不要忘记创建数组。

2
d = {} 
for date,temp in zip(dates,temps): 
    try: 
     d[date].append(temp) 
    except KeyError: 
     d[date] = [temp] 

print d 

你可以使用defaultdict改善稍微

from collections import defaultdict 
d = defaultdict(list) 
for date,temp in zip(dates,temps): 
    d[date].append(temp) 
+0

这种被广泛接受的做法是以这种方式使用try吗?我个人宁愿做“如果日期在d”而不是尝试,但我没有超出“看起来更好”的理由:-)。另外,无论如何,你的方式可能会更快。 – CodeMonkey

+0

在python中,它只是2种不同的思想流派(在你跳过(lbyl)(使用if语句)之前)或者(更容易请求原谅而不是权限(eafp)(try语句)),它更常见于看到try语句 –

+2

@CodeMonkey:请参阅词汇表中的[容易提出宽恕而不是权限](http://docs.python.org/3/glossary#term-eafp)(以及指向LBYL的链接以及鸭子键入的条目)这是被广泛接受的做法。 – abarnert

0

如果你真的想在阵列格式,这里是Joran的答案编辑给你DataArray中:

d = {} 
for date,temp in zip(dates,temps): 
    try: 
     d[date].append(temp) 
    except KeyError: 
     d[date] = [temp] 

dataarray = [] 
for year, temps in d.iteritems(): 
    tmp = [year] 
    tmp.extend(temps) 
    dataarray.append(tmp) 
print dataarray