根据熊猫中的另一个列值更改列值

时间:2019-10-30 10:43:36

标签: python pandas

我在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中的符号来更改开始和结束列中的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   -

谢谢您的帮助

4 个答案:

答案 0 :(得分:1)

使用:

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      -

答案 1 :(得分:1)

使用Series.mask

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      -

您还可以使用DataFrame.apply + DataFrame.where

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      -

答案 2 :(得分:1)

使用DataFrame.loc

df.loc[ df['strand'] == '-', ['start', 'end']] += [1, -2]
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      -

或使用numpy.where来增加或减少值:

m = df['strand'] == '-'
df['start'] = df['start'] + np.where(m, 1 ,0) 
df['end'] =  df['end'] - np.where(m, 2, 0)

或将掩码转换为整数,第二个值仅乘以2

m = df['strand'] == '-'
df['start'] = df['start'] + m.astype(int)
df['end'] =  df['end'] - m.astype(int) * 2

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      -

答案 3 :(得分:1)

另一个班轮可能是:

loc

使用from wsgiref.simple_server import make_server from pyramid.config import Configurator from test_view_defaults import RESTView if __name__ == '__main__': with Configurator() as config: config.add_route('rest', '/rest') config.scan() app = config.make_wsgi_app() server = make_server('0.0.0.0', 6543, app) server.serve_forever() 进行索引。