我有一个看起来像这样的数据框:
unit start stop
A 0.0 8.15
A 9.18 11.98
A 13.07 13.80
B 13.82 15.00
B 16.46 17.58
A 17.62 17.98
B 18.01 19.99
B 20.10 25.11
如何创建4个执行以下操作的列:
Continuous_unit_count(两列,每列一个)
此列保持运行状态的连续变化,以反映单位更改之前发生的连续单位数量。单位变更后复位为0。
Continuous_unit_time(两列,每个单位一列)
该列保持运行开始前和结束后每一行直到单位更改之间的时间总计。更改单位后,它也重置为0。
产生的df应该如下所示:
unit start stop unitA_tally unitA_time unitB_tally unitB_time
A 0.0 8.15 0 8.15 0 0
A 9.18 11.98 1 10.95 0 0
A 13.07 13.80 2 11.68 0 0
B 13.82 15.00 0 0 0 1.18
B 16.46 17.58 0 0 1 2.30
A 17.62 17.98 0 0.36 0 0
B 18.01 19.99 0 0 0 1.98
B 20.10 25.11 0 0 1 6.99
最佳答案
您实际上正在寻找tally=cumcount, time=cumsum
。所以这就是我要做的:
# these are the blocks
s = df['unit'].ne(df['unit'].shift()).cumsum()
# time for each row
times = df['stop'] - df['start']
# compute the new df
new_df = (times.groupby(s)
.agg(tally='cumcount', time='cumsum')
.assign(unit=df['unit'])
.pivot(columns='unit',
values=['tally', 'time'])
.fillna(0)
)
# rename the columns
new_df.columns = [f'unit{y}_{x}' for x,y in new_df.columns]
# concat
pd.concat((df, new_df), axis=1)
输出:
unit start stop unitA_tally unitB_tally unitA_time unitB_time
0 A 0.00 8.15 0.0 0.0 8.15 0.00
1 A 9.18 11.98 1.0 0.0 10.95 0.00
2 A 13.07 13.80 2.0 0.0 11.68 0.00
3 B 13.82 15.00 0.0 0.0 0.00 1.18
4 B 16.46 17.58 0.0 1.0 0.00 2.30
5 A 17.62 17.98 0.0 0.0 0.36 0.00
6 B 18.01 19.99 0.0 0.0 0.00 1.98
7 B 20.10 25.11 0.0 1.0 0.00 6.99
关于python - 累积栏,而其他栏不变,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58327024/