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?

questionAnswers(1)

yourAnswerToTheQuestion