ColG Col2 Col3 Len    Sign
G1   1    30   300    +
G2   20   80   200    +
G3   455  720  1000   -
G4   3    40   100    -
G4   2    90   130    +

Y aquí está la idea, para cada fila, si el signo es -, entonces haga:

Len-Col2 > NewCol2
Len-Col3 > NewCol3

Ejemplo

1000-720=289
1000-455=545
100-40=60
100-3=97

Y obten :

ColG Col2 Col3 Len    Sign NewCol2  NewCol3
G1   1    30   300    +    1        30
G2   20   80   200    +    20       80
G3   455  720  1000   -    220      545
G4   3    40   100    -    60       97
G4   2    90   130    +    2        90

Gracias por su ayuda

0
Grendel 28 abr. 2020 a las 13:45

2 respuestas

Si su marco de datos no es demasiado grande, puede probar esto.

def new_col2(row):
  if row['Sign'] == '-':
    return row['Len'] - row['Çol2']
  return row['Col2']

def new_col3(row):
  if row['Sign'] == '-':
    return row['Len'] - row['Çol3']
  return row['Col3']

df['NewCol2'] = df.apply(new_col2, axis=1)
df['NewCol3'] = df.apply(new_col3, axis=1)
0
dzakyputra 28 abr. 2020 a las 10:51

La primera idea es cómo es posible procesar todas las columnas junto con DataFrame.mask y DataFrame.rsub para restar el lado derecho del formulario:

m = df['Sign'].eq('-')
cols = ['Col2','Col3']
df2 = df[cols].mask(m, df[cols].rsub(df['Len'], axis=0))
df = df.join(df2.add_prefix('New'))
print (df)
  ColG  Col2  Col3   Len Sign  NewCol2  NewCol3
0   G1     1    30   300    +        1       30
1   G2    20    80   200    +       20       80
2   G3   455   720  1000    -      545      280
3   G4     3    40   100    -       97       60
4   G4     2    90   130    +        2       90

Otra idea es procesar cada columna por separado:

m = df['Sign'].eq('-')
cols = ['Col2','Col3']

for col in cols:
    df[f'New{col}'] = np.where(m, df['Len'].sub(df[col]), df[col])

print (df)
  ColG  Col2  Col3   Len Sign  NewCol2  NewCol3
0   G1     1    30   300    +        1       30
1   G2    20    80   200    +       20       80
2   G3   455   720  1000    -      545      280
3   G4     3    40   100    -       97       60
4   G4     2    90   130    +        2       90
0
jezrael 28 abr. 2020 a las 10:58