我有一个数据框,其中包含每个组在特定时间段内的观察数量。 某些群组不包含所有期间,对于这些群组,我想追加x行,其中包含所有期间。 这样每个组都有一个所有6个周期的行
我目前的df看起来像这样:
> ID PERIOD VAlUE
1 1 10
1 2 8
1 3 8
1 4 15
1 5 6
1 6 44
2 1 NONE
3 2 4
3 5 25
我希望数据框看起来像这样。
> ID PERIOD VAlUE
1 1 10
1 2 8
1 3 8
1 4 15
1 5 6
1 6 44
2 1 NONE
2 2 NONE
2 3 NONE
2 4 NONE
2 5 NONE
2 6 4
3 1 NONE
3 2 4
3 3 NONE
3 4 NONE
3 5 25
3 6 NONE
所发生的事情:
我真的不知道怎么做,所以真的很感激帮助。
答案 0 :(得分:3)
您可以将索引设置为“ID”和“PERIOD”,然后通过生成两列的乘积并将其作为reindex
的新索引传递来构造新索引,这具有可选{{1你可以设置为str fill_value
:
NONE
所以打破了上面的内容:
In [158]:
iterables = [df['ID'].unique(),df['PERIOD'].unique()]
df = df.set_index(['ID','PERIOD'])
df = df.reindex(index=pd.MultiIndex.from_product(iterables, names=['ID', 'PERIOD']), fill_value='NONE').reset_index()
df
Out[158]:
ID PERIOD VAlUE
0 1 1 10
1 1 2 8
2 1 3 8
3 1 4 15
4 1 5 6
5 1 6 44
6 2 1 NONE
7 2 2 NONE
8 2 3 NONE
9 2 4 NONE
10 2 5 NONE
11 2 6 NONE
12 3 1 NONE
13 3 2 4
14 3 3 NONE
15 3 4 NONE
16 3 5 25
17 3 6 NONE
答案 1 :(得分:0)
您可以在PERIOD
上取消堆叠结果,然后将dropna
选项设置为False进行叠加。
>>> df.groupby(['ID', 'PERIOD']).VAlUE.sum().unstack('PERIOD').stack('PERIOD', dropna=False)
ID PERIOD
1 1 10
2 8
3 8
4 15
5 6
6 44
2 1 NaN
2 NaN
3 NaN
4 NaN
5 NaN
6 NaN
3 1 NaN
2 4
3 NaN
4 NaN
5 25
6 NaN
dtype: object