如何通过在列中添加和减去值来重新整形数据框

时间:2016-05-24 12:21:32

标签: 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

我正在寻找的是更改列的开始和结束并从中获取一个新的数据框。就像我想要的新数据文件的开头为第一行的结尾+10和结束为开始第二行-10,依此类推所有行。数据框相当大,有70,000多行

所以,最后,我的目标是得到如下所示的数据框,因为在最后一行中没有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

非常感谢任何帮助

2 个答案:

答案 0 :(得分:4)

我认为您需要先按copy创建新的Series,然后将10添加到列End。最后您需要shift系列start,减去10

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

start = df['Start'].copy()
df['Start'] = df.End + 10
df['End'] = ((start.shift(-1) - 10))
df.iloc[-1, df.columns.get_loc('Start')] = np.nan
#if column Start is always in 3.position
#df.iloc[-1, 2] = np.nan 

print (df)
  Head  CHR    Start      End Transcriptid
0    a    1  12237.0  12603.0        ENST1
1    b    1  12731.0  13211.0        ENST8
2    c    1  14419.0  11862.0        ENST2
3    d    1  12237.0  12603.0        ENST5
4    f    1      NaN      NaN        ENST3

如果您需要空strings

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

答案 1 :(得分:1)

只需一步(除最后一项外,我不清楚问题中是否存在拼写错误):

df[['Start', 'End']] = np.add([df['End'], df['Start'].shift(-1).ffill()],
                              [[10], [-10]]).T