Eu tenho um dataframe como este, quero conseguir isso:
se o sinal de A é igual ao sinal de B, obtenha uma nova coluna C = min (3, | A |); se o sinal de A for diferente do sinal de B, C = min (3, B); se os valores de A e B forem zero, C = A
Type subType A B C
X a -1 4 3
X a 5 9 3
X a 5 9 3
X b 1 4 1
X b 3 5 ...
X b 5 0
Y a -1 1
Y a 3 2
Y a -5 3
Y b 1 4
Y b 3 5
Y b 5 -2
Eu tentei :
if df["A"] * df["B"] > 0:
df["C"] = (3, abs(df["A"]).min(axis=1)
Deu-me um erro, parece que não consigo comparar um valor '3' diretamente com uma coluna, alguma sugestão?
Acompanhamento: e se a fórmula for mais complexa C = A + min(3, |A|) *B
?
Porque se os valores para A e B são zero, significa usar mínimo entre (3, abs (0)) o que é sempre 0
solução deve ser simplificado com numpy.where
e numpy.minimum
:
#compare signs
m = np.sign(df["A"]) == np.sign(df["B"])
#alternative
#m = (df["A"] * df["B"]) >= 0
df['C'] = np.where(m, np.minimum(3, df.A.abs()), np.minimum(3, df.B))
print (df)
Type subType A B C
0 X a -1 4 3
1 X a 5 9 3
2 X a 5 9 3
3 X b 1 4 1
4 X b 3 5 3
5 X b 5 0 0
6 Y a -1 1 1
7 Y a 3 2 3
8 Y a -5 3 3
9 Y b 1 4 1
10 Y b 3 5 3
11 Y b 5 -2 -2
EDITAR: Se precisar de mais condição em pandas / numpy, é possível usar np.where
funções múltiplas numpy.select
:
m1 = np.sign(df.A) == np.sign(df.B)
m2 = np.sign(df.A) == np.sign(df.C)
s1 = df.A + np.minimum(3, df.A.abs()) * df.B
s2 = df.C + np.minimum(3, df.A.abs()) * df.B
df['D'] = np.select([m1, m2], [s1, s2], default=df.A)
print (df)
Type subType A B C D
0 X a -1 4 3 -1
1 X a 5 9 3 32
2 X a 5 9 3 32
3 X b 1 4 1 5
4 X b 3 5 3 18
5 X b 5 0 0 5
6 Y a -1 1 1 -1
7 Y a 3 2 3 9
8 Y a -5 3 3 -5
9 Y b 1 4 1 5
10 Y b 3 5 3 18
11 Y b 5 -2 -2 5
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras