Eu gostaria de fazer um cálculo por linha com elementos únicos de um dataframe do pandas e elementos de uma lista e, finalmente, fazer a soma por linha de todos esses cálculos:
O número de itens da lista x_i é idêntico ao número de colunas n_i no dataframe. Eu gostaria de calcular somas por linha como
Minha solução resulta apenas em 4 valores conforme faço um loop no número de colunas. Mas eu também poderia percorrer o número de elementos da lista, o que não altera o resultado.
result = []
for i in range(len(df_n.columns)): # these are 4
total = sum(2/3 * x[i]**2 * df_n.iloc[i])
result.append(total)
print(result)
usando mass = (math.pi/6 * binning[i]**3 * roh_solid * counts_nc.iloc[i]).sum()
resultados no mesmo
O próximo teste seria um loop adicional ao longo do comprimento do dataframe. Um loop dentro de um loop parece uma programação Python muito ruim. Preciso usar duas variáveis de loop para resolver isso?
Existe uma maneira otimizada do Python para resolver isso? Ou você pode me dar uma dica para uma pergunta semelhante sobre qual solução não encontrei com a função de pesquisa?
um exemplo de lista:
list = [0.4012, 0.551, 0.8124, 1.1402]
Um exemplo de quadro de dados:
n_1 n_2 n_3 n_4 \
time
2022-03-18 07:16:54 1.000000e-15 1.000000e-15 1.000000e-15 1.000000e-15
2022-03-18 07:16:55 7.887821e-01 4.929888e-02 1.000000e-15 1.000000e-15
2022-03-18 07:16:56 2.030013e+00 1.268758e-01 1.000000e-15 1.000000e-15
2022-03-18 07:16:57 2.944119e+00 3.236459e-01 1.000000e-15 4.654615e-02
2022-03-18 07:16:58 3.318537e+00 4.064088e-01 1.000000e-15 6.206153e-02
(a coluna de tempo é uma coluna de índice aqui.)
Parece que você pode simplesmente vetorizar sua operação:
Saída:
sobre seu código
Acho que há dois erros principais no seu código
df_n.iloc[i]
fornece a i-ésima linha, não a coluna). Você deveria usardf_n.iloc[:, i]
sum(2/3 * x[i]**2 * df_n.iloc[:, i])
calcularia o total por coluna, e é por isso que você acaba com 4 valores. No entanto, sua definição deTotal
somasi
(nas colunas). Você deve ter 5 valores na saída.Assim, corrigir a primeira parte do seu código daria:
O que equivale a:
Mas acredito que o que você realmente precisa é:
Que, como mostrado acima, é vetorizado para: