使用python Pandas更容易地填充缺少的字段



我使用了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
​

相关内容

  • 没有找到相关文章

最新更新