我有如下所示的数据框。
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的平均天数,以及所有其他列的平均天数。
答案 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