Groupby序列计数和序列持续时间

时间:2019-07-24 15:55:47

标签: python pandas pandas-groupby

我有如下所示的数据框。

ID  Nof_F-F  Nof_F-M  Nof_F-P Nof_M-F Nof_M-M  Nof_M-P Nof_P-F Nof_P-M
1   0        2        0       0       0        2       2       0
2   1        0        0       2       0        1       0       1
3   0        0        2       2       0        0       1       1
4   0        1        1       2       0        0       1       0

数据框已根据ID和日期进行排序

持续时间=该ID从最近状态到当前状态所花费的天数。

我想使用熊猫函数在数据框下方进行准备。

    ID  Avg_F-F  Avg_F-M  Avg_F-P Avg_M-F Avg_M-M  Avg_M-P Avg_P-F Avg_P-M
    1   nan      45.5     nan     nan     nan      76.5    197     nan
    2   122      nan      nan     76.5    nan      153     nan     61
    3   nan      nan      45.5    244     nan      nan     90      61
    4   nan      92       61      227.5   nan      nan     61      nan

其中Nof_F-F =连续F-F的数量,依此类推。

我也想准备以下数据框

dictionary

Avg_F-F =连续F-F的平均天数,以及所有其他列的平均天数。

1 个答案:

答案 0 :(得分:2)

由于已经排序,请使用shift + where创建链接。然后groupby + unstack

df['link'] = df.Status.shift().where(df.ID.eq(df.ID.shift())) + '-' + df.Status

df.groupby(['ID', 'link']).agg('size').unstack().fillna(0)
#link  F-F  F-M  F-P  M-F  M-P  P-F  P-M
#ID                                     
#1     0.0  2.0  0.0  0.0  2.0  2.0  0.0
#2     1.0  1.0  0.0  2.0  1.0  0.0  1.0
#3     0.0  0.0  2.0  2.0  0.0  1.0  1.0
#4     0.0  1.0  1.0  2.0  0.0  1.0  0.0

df.groupby(['ID', 'link']).Duration.mean().unstack()
#link    F-F   F-M   F-P    M-F    M-P    P-F   P-M
#ID                                                
#1       NaN  45.5   NaN    NaN   76.5  197.0   NaN
#2     122.0  59.0   NaN   76.5  153.0    NaN  61.0
#3       NaN   NaN  45.5  244.0    NaN   90.0  61.0
#4       NaN  92.0  61.0  227.5    NaN   61.0   NaN

要确保所有链接都存在于输出中,请在堆叠后使用reindex。您可以自己形成列表,也可以使用unique获取所有存在的值。

u = df.Status.unique()
cols = [f'{x}-{y}' for x in u for y in u]
#['F-F', 'F-M', 'F-P', 'M-F', 'M-M', 'M-P', 'P-F', 'P-M', 'P-P']

df.groupby(['ID', 'link']).Duration.mean().unstack().reindex(cols, axis=1)

#link    F-F   F-M   F-P    M-F  M-M    M-P    P-F   P-M  P-P
#ID                                                          
#1       NaN  45.5   NaN    NaN  NaN   76.5  197.0   NaN  NaN
#2     122.0  59.0   NaN   76.5  NaN  153.0    NaN  61.0  NaN
#3       NaN   NaN  45.5  244.0  NaN    NaN   90.0  61.0  NaN
#4       NaN  92.0  61.0  227.5  NaN    NaN   61.0   NaN  NaN