La devolución de múltiples valores de pandas se aplica en un DataFrame

Estoy usando un pandasDataFrame para hacer una prueba t de fila según este ejemplo:

import numpy
import pandas

df = pandas.DataFrame(numpy.log2(numpy.randn(1000, 4), 
                      columns=["a", "b", "c", "d"])

df = df.dropna()

Ahora, suponiendo que tengo "a" y "b" como un grupo, y "c" y "d" en el otro, estoy realizando la prueba t-fila. Esto es bastante trivial con pandas, usandoapply con eje = 1. Sin embargo, puedo devolver un DataFrame de la misma forma si mi función no se agrega, o una Serie si se agrega.

Normalmente, solo daría el valor p (entonces, la agregación) pero me gustaría generar un valor adicional basado en otros cálculos (en otras palabras, devolver dos valores). Por supuesto, puedo hacer dos ejecuciones, agregando primero los valores de p, luego haciendo el otro trabajo, pero me preguntaba si existe una forma más eficiente de hacerlo ya que los datos son razonablemente grandes.

Como ejemplo del cálculo, una función hipotética sería:

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)

Entonces invocado con

df.apply(t_test_and_mean, first=["a", "b"], second=["c", "d"], axis=1)

Por supuesto, en este caso, devuelve una sola Serie con las dos tuplas como valor.

En su lugar, ny el resultado esperado sería un DataFrame con dos columnas, una para el primer resultado y otra para el segundo. ¿Es esto posible o tengo que hacer dos corridas para los dos cálculos y luego combinarlas?

Respuestas a la pregunta(1)

Su respuesta a la pregunta