Накопительный столб, в то время как другой столб не изменяется в пандах - PullRequest
1 голос
/ 10 октября 2019

У меня есть датафрейм, который выглядит так:

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 столбца, которые выполняют следующие действия:

последовательно_всчет_1 (два столбца, по одному на каждую единицу)

В этом столбце ведется подсчет количества последовательных единиц, которые происходят до изменения единицы. После изменения единицы он сбрасывается до 0.

последовательно_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

1 Ответ

3 голосов
/ 10 октября 2019

Вы на самом деле ищете 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...