Возврат нескольких значений из pandas apply в 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-теста по строкам. Это довольно тривиально с пандами, используя 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)

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

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

46
задан piRSquared 4 January 2017 в 23:08
поделиться