2014-02-17 97 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