estoy usando un pandas DataFrame
hacer una prueba t de modo de fila según este ejemplo:devolver varios valores de pandas aplicarse sobre una trama de datos
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 el t-test en hilera. Esto es bastante trivial con los pandas, usando apply
con axis = 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 me gustaría generar el valor p (por lo tanto, 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 corridas, agregar los valores p primero, y luego hacer el otro trabajo, pero me preguntaba si existe una forma más eficiente de hacerlo ya que los datos son razonablemente grandes.
Como un ejemplo del cálculo, una función hypotethical 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 invoca con
df.apply(t_test_and_mean, first=["a", "b"], second=["c", "d"], axis=1)
Por supuesto, en este caso se devuelve un solo serie con los dos tuplas como valor .
En su lugar, la salida esperada 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 carreras para los dos cálculos, luego combinarlos?
¿Por qué está utilizando 'apply' en primer lugar? El resultado es un nuevo 'DataFrame' con una forma diferente a la entrada (tanto filas como columnas), por lo tanto, es un obj completamente nuevo. Simplemente podría hacer que 't_test_and_mean' acepte su marco de datos de entrada (y las columnas para agruparlo) y devolver un cuadro de datos de 1 fila-2-columnas, sin usar' apply'. – lbolla
@lbolla Correcto, terminé haciendo eso en mi código, eventualmente. – Einar