在python中填写缺少的行作为NaN

时间:2015-02-23 20:50:24

标签: python pandas

我有一个文件,每天有83个气象站的降水数据,每个站有101年。我想确定每个站每年的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 个答案:

答案 0 :(得分:2)

我可能会做的是创建一个目标MultiIndex,然后使用它来索引。例如:

>>> 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()

答案 1 :(得分:0)

[编辑]

这不是熊猫的答案:当我开始回答问题时,问题并没有标记为大熊猫,我会在这里放过它,因为它可以使某人受益。

假设您使用dict组织数据,其中键是(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函数留给读者练习。