我使用了pandas中的groupby方法,该方法可以根据id和时间进行分组,例如:
| id | month | average tree growth (cm)|
|----|-------|-------------------------|
| 1 | 4 | 9 |
| 1 | 5 | 4 |
| 1 | 6 | 7 |
| 2 | 1 | 9 |
| 2 | 2 | 9 |
| 2 | 3 | 8 |
| 2 | 4 | 6 |
然而,每个id应该有12个月,我需要在缺失的月份填充树的平均高度为空值,如下所示:
| id | month | average tree growth (cm)|
|----|-------|-------------------------|
| 1 | 1 | nan |
| 1 | 2 | nan |
| 1 | 3 | nan |
| 1 | 4 | 9 |
| 1 | 5 | 4 |
| 1 | 6 | 7 |
| 1 | 7 | nan |
| 1 | 8 | nan |
| 1 | 9 | nan |
| 1 | 10 | nan |
| 1 | 11 | nan |
| 1 | 12 | nan |
| 2 | 1 | 9 |
这是为了虚化绘图的目的,我如何添加丢失的月份到每个id和填充平均高度nan在这种情况下使用python?还有比暴力破解所有id和检查几个月更简单的方法吗?任何提示将不胜感激!
一种方法是创建MultiIndex
并通过使用pd.MultiIndex.from_product
和.reindex()
重新索引,如下所示:
mux = pd.MultiIndex.from_product([df['id'].unique(), np.arange(1, 13)],
names=['id', 'month'])
df.set_index(['id', 'month']).reindex(mux).reset_index()
结果:
id month average tree growth (cm)
0 1 1 NaN
1 1 2 NaN
2 1 3 NaN
3 1 4 9.0
4 1 5 4.0
5 1 6 7.0
6 1 7 NaN
7 1 8 NaN
8 1 9 NaN
9 1 10 NaN
10 1 11 NaN
11 1 12 NaN
12 2 1 9.0
13 2 2 9.0
14 2 3 8.0
15 2 4 6.0
16 2 5 NaN
17 2 6 NaN
18 2 7 NaN
19 2 8 NaN
20 2 9 NaN
21 2 10 NaN
22 2 11 NaN
23 2 12 NaN
一个可能的解决方案是:
(df.groupby('id')['month']
.apply(lambda x:np.arange(1, 13))
.explode()
.reset_index()
.merge(df, how='left')
)
生产:
id month average tree growth (cm)
0 1 1 NaN
1 1 2 NaN
2 1 3 NaN
3 1 4 9.0
4 1 5 4.0
5 1 6 7.0
6 1 7 NaN
7 1 8 NaN
8 1 9 NaN
9 1 10 NaN
10 1 11 NaN
11 1 12 NaN
12 2 1 9.0
13 2 2 9.0
14 2 3 8.0
15 2 4 6.0
16 2 5 NaN
17 2 6 NaN
18 2 7 NaN
19 2 8 NaN
20 2 9 NaN
21 2 10 NaN
22 2 11 NaN
23 2 12 NaN