Retornando vários valores de pandas se aplicam em um DataFrame
Estou usando um pandasDataFrame
para fazer um teste t em linha conforme este exemplo:
import numpy
import pandas
df = pandas.DataFrame(numpy.log2(numpy.randn(1000, 4),
columns=["a", "b", "c", "d"])
df = df.dropna()
Agora, supondo que eu tenha "a" e "b" como um grupo, e "c" e "d" no outro, estou realizando o teste t-row. Isso é bastante trivial com os pandas, usandoapply
com eixo = 1. No entanto, posso retornar um DataFrame da mesma forma se minha função não for agregada ou uma série se for agregada.
Normalmente, eu apenas emitia o valor p (assim, agregação), mas gostaria de gerar um valor adicional com base em outros cálculos (em outras palavras, retornar dois valores). É claro que posso fazer duas execuções, agregando primeiro os valores p, depois fazendo o outro trabalho, mas queria saber se há uma maneira mais eficiente de fazer isso, pois os dados são razoavelmente grandes.
Como exemplo do cálculo, uma função hipotética seria:
from scipy.stats import ttest_ind
def t_test_and_mean(series, first, second):
first_group = series[first]
second_group = series[second]
_, pvalue = ttest_ind(first_group, second_group)
mean_ratio = second_group.mean() / first_group.mean()
return (pvalue, mean_ratio)
Então invocado com
df.apply(t_test_and_mean, first=["a", "b"], second=["c", "d"], axis=1)
Claro que neste caso ele retorna uma única série com as duas tuplas como valor.
Em vez disso, a saída esperada seria um DataFrame com duas colunas, uma para o primeiro resultado e uma para o segundo. Isso é possível ou eu tenho que fazer duas corridas para os dois cálculos e depois juntá-los?