我有一个文件,每天有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
我希望这是有道理的。
答案 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
函数留给读者练习。