Подтвердить что ты не робот

Возврат нескольких значений из pandas применяется к DataFrame

Я использую Pandas DataFrame для выполнения t-теста по строке в соответствии с этим примером:

import numpy
import pandas

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

df = df.dropna()

Теперь, полагая, что у меня есть "a" и "b" как одна группа, а "c" и "d" - в другой, я выполняю t-тест по ряду. Это довольно тривиально с pandas, используя apply с осью = 1. Тем не менее, я могу либо вернуть DataFrame той же формы, если моя функция не агрегируется, или серия, если она агрегируется.

Обычно я просто выводил значение p (так, агрегация), но я хотел бы генерировать дополнительное значение на основе других вычислений (другими словами, вернуть два значения). Я, конечно, могу сделать два прогона, сначала агрегируя значения p, а затем выполняя другую работу, но мне было интересно, есть ли более эффективный способ сделать это, поскольку данные достаточно велики.

В качестве примера вычисления гипотитическая функция будет:

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)

Затем вызывается с помощью

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

Конечно, в этом случае он возвращает одну серию с двумя кортежами как значение.

Вместо этого ny ожидаемый вывод будет DataFrame с двумя столбцами, один для первого результата, второй - для второго. Возможно ли это, или мне нужно выполнить два прогона для двух вычислений, а затем объединить их вместе?

4b9b3361

Ответ 1

Возвращение серии, а не кортежа, должно привести к созданию нового многоканального DataFrame. Например,

return pandas.Series({'pvalue': pvalue, 'mean_ratio': mean_ratio})