Python 如何通过在列中添加和减去值来重塑数据帧

Python 如何通过在列中添加和减去值来重塑数据帧,python,numpy,pandas,Python,Numpy,Pandas,我有一个像这样的数据框 Head CHR Start End Transcriptid a 1 11869 12227 ENST1 b 1 12613 12721 ENST8 c 1 13221 14409 ENST2 d 1 11872 12227 ENST5 f 1 12613 12721 ENST3 我想要的是稍微更改列的开始和结束,

我有一个像这样的数据框

   Head CHR Start   End Transcriptid    
    a   1   11869   12227   ENST1
    b   1   12613   12721   ENST8   
    c   1   13221   14409   ENST2   
    d   1   11872   12227   ENST5   
    f   1   12613   12721   ENST3
我想要的是稍微更改列的开始和结束,并从中获得一个新的数据帧。比如,我想要一个新的数据文件,所有行的开始为第一行的结束+10,结束为第二行的开始-10,依此类推。数据帧非常大,有70000多行

最后,我的目标是得到如下所示的数据帧,因为在最后一行中,Start和end没有值

Head CHR Start  End  Transcriptid
a   1   12237   12603   ENST1
b   1   12731   13211   ENST8
c   1   14419   11862   ENST2
d   1   12237   12603   ENST5
f   1                   ENST3

任何帮助都将不胜感激

我认为您需要首先创建新的
系列
,然后将
10
添加到
列结束
。最后您需要序列
开始
,减号
10

最后您需要将列
Start
的最后一个值更改为
NaN
-您可以使用:

如果需要空的
字符串

start = df['Start'].copy()
df['Start'] = df.End + 10
df['End'] = ((start.shift(-1) - 10))
df.iloc[-1, df.columns.get_loc('Start')] = ''
df.iloc[-1, df.columns.get_loc('End')] = ''
print (df)
  Head  CHR  Start    End Transcriptid
0    a    1  12237  12603        ENST1
1    b    1  12731  13211        ENST8
2    c    1  14419  11862        ENST2
3    d    1  12237  12603        ENST5
4    f    1                      ENST3

我认为您需要首先创建新的
系列
by,然后将
10
添加到列
End
。最后您需要序列
开始
,减号
10

最后您需要将列
Start
的最后一个值更改为
NaN
-您可以使用:

如果需要空的
字符串

start = df['Start'].copy()
df['Start'] = df.End + 10
df['End'] = ((start.shift(-1) - 10))
df.iloc[-1, df.columns.get_loc('Start')] = ''
df.iloc[-1, df.columns.get_loc('End')] = ''
print (df)
  Head  CHR  Start    End Transcriptid
0    a    1  12237  12603        ENST1
1    b    1  12731  13211        ENST8
2    c    1  14419  11862        ENST2
3    d    1  12237  12603        ENST5
4    f    1                      ENST3
在单个步骤中(除了最后一项,我不清楚问题中是否有拼写错误):

在单个步骤中(除了最后一项,我不清楚问题中是否有拼写错误):


谢谢您的解决方案,但这里有一个问题..这一行df['Start']=df.End+10..是从第二行开始的,这意味着第一个开始就是第一行的结束列。您认为最后一个值是什么?实际上,开始应该始终是End+10,结束应该始终是:Start-10。因此,对于第一行,开始应该是12227-10,对于结束它是:12613+10。很抱歉,如果我不清楚,那么您需要
df['Start'],df['End']=(df.End+10).copy(),(df.Start-10).copy()
?但结果是不同的。请检查一下。我认为
f
行中
Start
列中的最后一个值是打字错误。您好,我对我的问题进行了一些编辑,以消除混淆,因此最后一行不会有Start和End的值,因为我们从第二行的Start值开始第一行的Start值-10感谢您的解决方案,但是这里有一个问题..这行df['Start']=df.End+10..是从第二行开始的,这意味着第一行的结束列就是第一行的结束列。您认为最后一个值是什么?实际上,开始应该始终是End+10,结束应该始终是:Start-10。因此,对于第一行,开始应该是12227-10,对于结束它是:12613+10。很抱歉,如果我不清楚,那么您需要
df['Start'],df['End']=(df.End+10).copy(),(df.Start-10).copy()
?但结果是不同的。请检查一下。我认为第
f
行的
Start
列中的最后一个值是输入错误。您好,我对我的问题进行了一些编辑,以消除混淆,因此最后一行不会有Start和End的值,因为我们从第二行的起始值开始第一行的起始值-10是的,这是一个输入错误,现在我编辑了我的问题,所以现在你可以看到最后一行的起始值和结束值都没有。是的,这是一个输入错误,现在我编辑了我的问题,所以现在你可以看到最后一行的起始值和结束值都没有
df[['Start', 'End']] = np.add([df['End'], df['Start'].shift(-1).ffill()],
                              [[10], [-10]]).T