python - column - La devolución de múltiples valores de pandas se aplica a un DataFrame
pandas unstack (1)
Devolver una serie, en lugar de una tupla, debería producir un nuevo DataFrame de múltiples columnas. Por ejemplo,
return pandas.Series({''pvalue'': pvalue, ''mean_ratio'': mean_ratio})
Estoy usando un DataFrame
para hacer una prueba de t 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, realizaré el t-test en hilera. Esto es bastante trivial con 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, solo mostraría el valor p (por lo tanto, 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 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)
Luego 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 cambio, el resultado esperado es 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?