如果每个组缺少一行,则在pandas / ipython中为每个组添加行数

时间:2015-06-18 14:45:11

标签: pandas append

我有一个数据框,其中包含每个组在特定时间段内的观察数量。 某些群组不包含所有期间,对于这些群组,我想追加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

所发生的事情:

  • 对于ID == 1,没有任何反应,因为它包含所有6个句号
  • 对于ID == 2,它为第一个df中没有的每个句点附加5行。
  • 对于ID == 2,它为第一个df中没有的每个句点附加4行。所以它增加了1,3,4和1期间的行数。 6。

我真的不知道怎么做,所以真的很感激帮助。

2 个答案:

答案 0 :(得分:3)

您可以将索引设置为“ID”和“PERIOD”,然后通过生成两列的乘积并将其作为reindex的新索引传递来构造新索引,这具有可选{{1你可以设置为str fill_value

的param
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