如何根据上一行更改列内容?

How do I change column content based on previous row?

抱歉。每当我尝试将它们制作成表格而不是代码时,它似乎认为我嵌入了代码并且不会让我 post 这个。

所以这是一个例子我有什么

ID File Period Begin End Laser1 Laser2 Lead
A01 longname.zip Baseline 0 30500 qfin plethh plethi
A01 longname.zip Run 30500 68500 qfin plethh plethi
A01 longname.zip Recovery 68500 158000 qfin plethh plethi
A01 longname2.zip Baseline 2000 43000 qfin plethh plethi
A01 longname2.zip Run 45000 135000 qfin plethh plethi
A01 longname2.zip Recovery 135000 305000 qfin plethh plethi

下面是我想要的例子

ID File Period Begin End Laser1 Laser2 Lead
A01 longname.zip Baseline 0 6000 qfin plethh plethi
A01 longname.zip Baseline 1000 7000 qfin plethh plethi
A01 longname.zip Baseline 2000 8000 qfin plethh plethi
A01 longname.zip Baseline 3000 9000 qfin plethh plethi

等等

ID File Period Begin End Laser1 Laser2 Lead
A01 longname.zip Baseline 24000 30500 qfin plethh plethi
A01 longname.zip Run 30500 36500 qfin plethh plethi
A01 longname.zip Run 31500 37500 qfin plethh plethi
A01 longname.zip Run 32500 38500 qfin plethh plethi

我已经设法按唯一文件名进行过滤并复制了所需的行

我似乎无法做的是更改开始值和结束值并按期间将它们分段。我目前的结果,可能是由于我的行重复,是这样的

ID File Period Begin End Laser1 Laser2 Lead
A01 longname.zip Baseline 0 30500 qfin plethh plethi
A01 longname.zip Baseline 0 30500 qfin plethh plethi
A01 longname.zip Baseline 0 30500 qfin plethh plethi
A01 longname.zip Baseline 0 30500 qfin plethh plethi
A01 longname.zip Baseline 0 30500 qfin plethh plethi
A01 longname.zip Baseline 0 30500 qfin plethh plethi
A01 longname.zip Run 30500 68500 qfin plethh plethi
A01 longname.zip Run 30500 68500 qfin plethh plethi
A01 longname.zip Run 30500 68500 qfin plethh plethi
A01 longname.zip Run 30500 68500 qfin plethh plethi
A01 longname.zip Run 30500 68500 qfin plethh plethi

在 Python 和 R 中,我似乎都卡在了同一个地方。我现在对 R 更满意,但开始尝试 Python.

我似乎无法修正“开始”和“结束”列中的数字。

在 R 中,它认为我希望它循环遍历我没有的 1000 列,而不是向每一行添加 1000。遗憾的是,并非所有文件都从 0 开始,结束列和开始列之间可能存在间隙。

R

 Period = dupdf$Period
 
 for (period in Period) {
   
   End_Final = max(dupdf$End)
   
   dupdf_period <- dupdf%>%
     filter(Period == period)
   
   for (i in 2:nrow(dupdf_period)){
   
     dupdf_period[i,Begin ] <- dupdf_period[i,Begin ] + 1000
     dupdf_period[i,End ] <- dupdf_period[i,Begin ] + 6000
     
     if (dupdf_period$End < End_Final){
       dupdf_period$End
     } else {
       End_Final
       break
       }
     } 
   dupdf_period[1,End ] <- dupdf_period[1,Begin ] + 6000
   
   dupdf <-  rbind(dupdf_period)
   }
 write.csv(dupdf, filename)
 }

在Python

for period in Period:

                row_index = 2

                for row_index in concat_df.index:
                    #for row in concat_df.itertuples:
                    concat_df.at[row_index , "Begin"] += 1000

                    row_index2 = 1
                    for row_index2 in concat_df.index:
                        concat_df.at[row_index2, "End"] += (Begin + 6000)

                        concat_df['End'] = np.where((concat_df.End >= End_Final), concat_df.End.replace(End_Final), concat_df.End)

编辑 感谢 r2evans 现在没有 rowwise().

也许这就是您要找的:

library(dplyr)
library(tidyr)

df %>% 
  mutate(Begin_New = Map(seq, Begin, End - 6000, list(by = 1000))) %>% 
  unnest(Begin_New) %>% 
  group_by(ID, File, Period) %>% 
  mutate(End_New = ifelse(Begin_New + 7000 > End, End, Begin_New + 6000))

returns

# A tibble: 428 x 10
   ID    File         Period   Begin   End Laser1 Laser2 Lead   Begin_New End_New
   <chr> <chr>        <chr>    <dbl> <dbl> <chr>  <chr>  <chr>      <dbl>   <dbl>
 1 A01   longname.zip Baseline     0 30500 qfin   plethh plethi         0    6000
 2 A01   longname.zip Baseline     0 30500 qfin   plethh plethi      1000    7000
 3 A01   longname.zip Baseline     0 30500 qfin   plethh plethi      2000    8000
 4 A01   longname.zip Baseline     0 30500 qfin   plethh plethi      3000    9000
 5 A01   longname.zip Baseline     0 30500 qfin   plethh plethi      4000   10000
 6 A01   longname.zip Baseline     0 30500 qfin   plethh plethi      5000   11000
 7 A01   longname.zip Baseline     0 30500 qfin   plethh plethi      6000   12000
 8 A01   longname.zip Baseline     0 30500 qfin   plethh plethi      7000   13000
 9 A01   longname.zip Baseline     0 30500 qfin   plethh plethi      8000   14000
10 A01   longname.zip Baseline     0 30500 qfin   plethh plethi      9000   15000
11 A01   longname.zip Baseline     0 30500 qfin   plethh plethi     10000   16000
12 A01   longname.zip Baseline     0 30500 qfin   plethh plethi     11000   17000
13 A01   longname.zip Baseline     0 30500 qfin   plethh plethi     12000   18000
14 A01   longname.zip Baseline     0 30500 qfin   plethh plethi     13000   19000
15 A01   longname.zip Baseline     0 30500 qfin   plethh plethi     14000   20000
16 A01   longname.zip Baseline     0 30500 qfin   plethh plethi     15000   21000
17 A01   longname.zip Baseline     0 30500 qfin   plethh plethi     16000   22000
18 A01   longname.zip Baseline     0 30500 qfin   plethh plethi     17000   23000
19 A01   longname.zip Baseline     0 30500 qfin   plethh plethi     18000   24000
20 A01   longname.zip Baseline     0 30500 qfin   plethh plethi     19000   25000
21 A01   longname.zip Baseline     0 30500 qfin   plethh plethi     20000   26000
22 A01   longname.zip Baseline     0 30500 qfin   plethh plethi     21000   27000
23 A01   longname.zip Baseline     0 30500 qfin   plethh plethi     22000   28000
24 A01   longname.zip Baseline     0 30500 qfin   plethh plethi     23000   29000
25 A01   longname.zip Baseline     0 30500 qfin   plethh plethi     24000   30500
26 A01   longname.zip Run      30500 68500 qfin   plethh plethi     30500   36500
27 A01   longname.zip Run      30500 68500 qfin   plethh plethi     31500   37500
28 A01   longname.zip Run      30500 68500 qfin   plethh plethi     32500   38500
29 A01   longname.zip Run      30500 68500 qfin   plethh plethi     33500   39500
30 A01   longname.zip Run      30500 68500 qfin   plethh plethi     34500   40500

我将列命名为 Begin_NewEnd_New,您可以轻松地将其更改为 BeginEnd