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