根据表中的另一列值更改列值

2024-09-25 02:39:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python中有一个数据帧,例如:

seqnames    start   end name    number  strand
     A       50     453   A      1        -
     B       30     322   A      2        -
     C       10     432   A      3        -
     D       36     344   A      4        +
     E       40     321   A      5        +
     F       78     234   A      6        -

我想根据strand column中的符号来更改start和end列中的de值。你知道吗

所以对于每一行,如果strand-,那么start+1end-2 如果链是+,那么什么也不做

我应该得到:

seqnames    start   end name    number  strand
A   51  451 A   1   -
B   31  320 A   2   -
C   11  430 A   3   -
D   36  344 A   4   +
E   40  321 A   5   +
F   79  232 A   6   -

谢谢你的帮助


Tags: 数据namenumber符号decolumnstartend
3条回答

使用^{}

df['start'].mask(df['strand']=='-',df['start']+1,inplace=True)
df['end'].mask(df['strand']=='-',df['end']-2,inplace=True)

print(df)

  seqnames  start  end name  number strand
0        A     51  451    A       1      -
1        B     31  320    A       2      -
2        C     11  430    A       3      -
3        D     36  344    A       4      +
4        E     40  321    A       5      +
5        F     79  232    A       6      -

也可以使用^{}+^{}

df[['start','end']]=( df[['start','end']]
                   .apply(lambda x: pd.Series((x['start']+1,x['end']-2)).rename({0:'start',1:'end'}),axis=1)
                   .where(df['strand']=='-',df[['start','end']])
                    )

print(df)
  seqnames  start  end name  number strand
0        A     51  451    A       1      -
1        B     31  320    A       2      -
2        C     11  430    A       3      -
3        D     36  344    A       4      +
4        E     40  321    A       5      +
5        F     79  232    A       6      -

另一个班轮可以是:

df.loc[ df['strand'] == '-', 'start'] = df.loc[ df['strand'] == '-', 'start'] + 1

它使用loc进行索引。你知道吗

用途:

df[['start','end']]=np.where(df['strand'].eq('-')[:,None],
                np.column_stack((df['start']+1,df['end']-2)),
                df[['start','end']].values)
print(df)

  seqnames  start  end name  number strand
0        A     51  451    A       1      -
1        B     31  320    A       2      -
2        C     11  430    A       3      -
3        D     36  344    A       4      +
4        E     40  321    A       5      +
5        F     79  232    A       6      -

相关问题 更多 >