首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在python中将缺失的行填写为NaN

在python中将缺失的行填写为NaN
EN

Stack Overflow用户
提问于 2015-02-23 20:50:24
回答 2查看 149关注 0票数 2

我有一个文件,其中有来自83个气象站和每个气象站101年的逐日降水数据。我想确定每个车站每年NaN的数量。

作为一个简短的例子,让我们假设我只有一个站,只关心1年的数据,2009年。

如果我有这个:

代码语言:javascript
运行
复制
 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

我想谈一谈:

代码语言:javascript
运行
复制
 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年了。

我试图使用以下代码:

代码语言:javascript
运行
复制
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

我希望这是有意义的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-23 21:05:33

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

代码语言:javascript
运行
复制
>>> 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()

票数 2
EN

Stack Overflow用户

发布于 2015-02-23 21:00:44

编辑

这不是熊猫的答案:当我开始回答的时候,问题并没有给熊猫贴上标签,我会让它在这里,因为它能让某人受益。

假设您使用dict组织数据,其中键是(station_id, year, month)的元组,值是数据点的数组??您可以使用collections.defaultdict

代码语言:javascript
运行
复制
>>> data = defaultdict(lambda: [None, None, None])
>>> data[(210018, 2009, 3)]
[None, None, None]

你可能是在读文件,我不会帮你做所有的作业--给你一些提示。

代码语言:javascript
运行
复制
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函数是留给读者的练习。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28683177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档