2015-02-23 35 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函数是留给读者的练习。