Estou tentando iterar várias linhas de colunas e multiplicar a enésima linha por n+1 linha e depois adicionar colunas.
Testei o código abaixo e está funcionando bem.
Existe alguma outra maneira simples de realizar a subtração e a multiplicação juntas?
import pandas as pd
df = pd.DataFrame({'C': ["Spark","PySpark","Python","pandas","Java"],
'F' : [2,4,3,5,4],
'D':[3,4,6,5,5]})
df1 = pd.DataFrame({'C': ["Spark","PySpark","Python","pandas","Java"],
'F': [1,2,1,2,1],
'D':[1,2,2,2,1]})
df = pd.merge(df, df1, on="C")
df['F_x-F_y'] = df['F_x'] - df['F_y']
df['D_x-D_y'] = df['D_x'] - df['D_y']
for index, row in df.iterrows():
df['F_mul'] = df['F_x-F_y'].mul(df['F_x-F_y'].shift())
df['D_mul'] = df['D_x-D_y'].mul(df['D_x-D_y'].shift())
df['F+D'] = df['F_mul'] + df['D_mul']
Saída -
C F_x D_x F_y D_y F_x-F_y D_x-D_y F_mul D_mul F+D
0 Spark 2 3 1 1 1 2 NaN NaN NaN
1 PySpark 4 4 2 2 2 2 2.0 4.0 6.0
2 Python 3 6 1 2 2 4 4.0 8.0 12.0
3 pandas 5 5 2 2 3 3 6.0 12.0 18.0
4 Java 4 5 1 1 3 4 9.0 12.0 21.0
Primeiro remova a iteração por
iterrows
, então é possível simplificar uma solução generalizada por:Outra ideia é processar todas as colunas juntas - a vantagem é que não é necessário especificar colunas para processamento:
Você pode remover a iteração através de linhas inteiramente. Seu código não faz nada específico de linha dentro do
iterrows()
loop -- nem valoresindex
nemrow
são usados. O que acontece é que você acaba recalculando a coluna inteira (F_mul e D_mul) em cada iteração.Exemplo
Você realmente não deve usar loops ou
iterrows
pandas.O que você quer fazer pode ser alcançado vetorialmente. Você não deve ter a chave C como coluna, mas sim como índice para aproveitar o alinhamento automático dos índices:
Você pode até ter tudo como uma única expressão (exceto sub):
Saída:
E se você não precisar das colunas intermediárias
_sub
,_mul
isso é ainda mais fácil:Ou:
Saída: