我使用了 Pandas 的 groupby 方法,它可以在這個示例 csv 中按 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 |
這是用于散景繪圖目的,在這種情況下,如何使用 python 將缺少的月份添加到每個 id 并將平均高度填充為 nan?有沒有比暴力回圈所有 id 并檢查幾個月更簡單的方法?任何提示將不勝感激!
uj5u.com熱心網友回復:
一種可能的解決方案如下:
(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
?
uj5u.com熱心網友回復:
您可以使用.stack()和.unstack()來重塑month為列,擴展到所有 12 個月.reindex(),然后恢復到原始形狀,如下所示:
如果您已經通過分組id并month使得id和month已經是行索引,您可以使用:
(df.unstack()
.stack(level=0)
.reindex(columns=np.arange(1, 13))
.stack(dropna=False)
.unstack(level=1)
.reset_index()
)
或者,如果沒有按分組id和month又或者你使用as_index=False的GROUPBY,使得id和month不是行的索引,你可以使用:
(df.set_index(['id', 'month'])
.unstack()
.stack(level=0)
.reindex(columns=np.arange(1, 13))
.stack(dropna=False)
.unstack(level=1)
.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
編輯
另一種方法是MultiIndex使用pd.MultiIndex.from_productand來創建和重新索引.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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/321811.html
