我有一个看起来像这样的数据框:



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/

10-09 13:26