Eu sou novo para isso, então isso pode soar estranho, mas basicamente, eu tenho uma grande trama de dados, mas para fins de simplificação vamos supor que a trama de dados é a seguinte:
import pandas as pd
import numpy as np
dfn = pd.DataFrame({'a':[1,2,3,4,5],
'b':[6,7,8,9,10],
'c':np.nan})
dfn
Resultado:
a b c
0 1 6 NaN
1 2 7 NaN
2 3 8 NaN
3 4 9 NaN
4 5 10 NaN
O que eu quero fazer é preencher valores na coluna 'c' baseado fora de uma condição, ou seja, se o valor de linha correspondente no 'a' é ímpar, então adicioná-lo ao valor de linha correspondente 'b' e entrada em ' c', do contrário, basta usar o 'a' valor para 'c'.
O que eu tenho atualmente é esta:
for row in range(dfn.shape[0]):
if dfn.loc[row]['a']%2!=0:
dfn.loc[row]['c']=dfn.loc[row]['a']+dfn.loc[row]['b']
else:
dfn.loc[row]['c']=dfn.loc[row]['a']
dfn
Resultado:
a b c
0 1 6 NaN
1 2 7 NaN
2 3 8 NaN
3 4 9 NaN
4 5 10 NaN
Nada parece acontecer aqui e eu não sou inteiramente certo porque.
Eu também tentei uma abordagem diferente de:
is_odd=dfn[dfn['a']%2!=0]
is_odd['c'] = is_odd['a'] + is+odd['b']
is_odd
Aqui, estranhamente eu recebo a saída direita:
a b c
0 1 1 2
2 3 3 6
4 5 5 10
Mas quando eu chamo dfn novamente, ele sai com todos os valores NaN.
Eu também tentei fazê-lo sem o uso de um nome de variável e nada acontece.
Qualquer idéia do que estou em falta ou se há uma maneira de fazer isso?
Obrigado!
Use numpy onde , que trabalha para condicionais. É semelhante a uma declaração se em python, mas significativamente mais rápido. i raramente usam iterrows, desde que eu não encontrá-lo tão eficiente quanto numpy onde.
dfn['c'] = np.where(dfn['a']%2 !=0,
dfn.a + dfn.b,
dfn.a)
a b c
0 1 6 7
1 2 7 2
2 3 8 11
3 4 9 4
4 5 10 15
Basicamente, a primeira linha em np.where define ur condição, que neste caso é descobrir se a coluna de 'a' é um número impar. Se for, a próxima linha é executada. se é um número par, em seguida, a última linha é executada. você pode pensar nisso como uma declaração if-else.