2015-02-23 27 views
2

我有一個文件,每天有83個氣象站的降水數據,每個站101年。我想確定每個電臺每年NaN的數量。在Python中填寫缺失的行爲NaN

作爲一個縮短的例子,假設我只有一個站和只關心約1年的數據,2009年

如果我有這樣的:

station_id year month 1 2  3 
210018  2009 1  5 6  8 
210018  2009 2  NaN NaN 6 
210018  2009 12  8 5  6 

我想這樣的:

station_id year month 1 2  3 
210018  2009 1  5 6  8 
210018  2009 2  NaN NaN 6 
210018  2009 3  NaN NaN NaN 
210018  2009 4  NaN NaN NaN 
210018  2009 5  NaN NaN NaN 
210018  2009 6  NaN NaN NaN 
210018  2009 7  NaN NaN NaN 
210018  2009 8  NaN NaN NaN 
210018  2009 9  NaN NaN NaN 
210018  2009 10  NaN NaN NaN 
210018  2009 11  NaN NaN NaN 
210018  2009 12  8 5  6 

所以我的車站需要12行12個月和一年一起去每一個。我再次以真實的例子展現101年。

我想使用此代碼:

df_indexed=df.set_index(['year']) 
new_index=np.arange(1910,2011,1) 
idx=pd.Index(new_index) 
df2=df_indexed.reindex(idx, method=None) 

但它返回一個長的錯誤與

ValueError: cannot reindex from a duplicate axis

我希望是有道理的結束。

回答

2

我可能會做的是什麼創建目標多指標,然後用它來索引,例如:

>>> target_ix = pd.MultiIndex.from_product([df.station_id.unique(), 
    np.arange(1910, 2011, 1), np.arange(1,13)], 
    names=["station_id", "year", "month"]) 
>>> df = df.set_index(["station_id", "year", "month"]) 
>>> new_df = df.loc[target_ix] 
>>> new_df.tail(24) 
         1 2 3 
station_id year month    
210018  2009 1  5 6 8 
       2  NaN NaN 6 
       3  NaN NaN NaN 
       4  NaN NaN NaN 
       5  NaN NaN NaN 
       6  NaN NaN NaN 
       7  NaN NaN NaN 
       8  NaN NaN NaN 
       9  NaN NaN NaN 
       10 NaN NaN NaN 
       11 NaN NaN NaN 
       12  8 5 6 
      2010 1  NaN NaN NaN 
       2  NaN NaN NaN 
       3  NaN NaN NaN 
       4  NaN NaN NaN 
       5  NaN NaN NaN 
       6  NaN NaN NaN 
       7  NaN NaN NaN 
       8  NaN NaN NaN 
       9  NaN NaN NaN 
       10 NaN NaN NaN 
       11 NaN NaN NaN 
       12 NaN NaN NaN 

您可以.reset_index()在這一點上,如果你喜歡。

+0

非常感謝! – spotter 2015-02-23 21:15:30

0

[編輯]

這不是大熊貓答:當我開始回答的問題沒有標記的熊貓,我會讓它在這裏,因爲它可以受益的人。

假設你使用的字典整理數據,其中的關鍵是(station_id, year, month)元組和值是數據點的數組 - 您可以使用collections.defaultdict

>>> data = defaultdict(lambda: [None, None, None]) 
>>> data[(210018, 2009, 3)] 
[None, None, None] 

你可能從文件中讀取,我不會爲你做所有的功課 - 只是提供一些提示。

for line in file: 
    station_id, year, month, d1, d2, d3 = parse_line(line) 
    data[(station_id, year, month)] = [ 
     None if d == 'NaN' else float(d) for d in (d1, d2, d3) 
    ] 

編寫parse_line函數是留給讀者的練習。