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

Я пользуюсь пандами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 той же формы, если моя функция не агрегирует, или Series, если она агрегирует.

Обычно, я бы просто вывел 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)

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

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

 Einar28 мая 2012 г., 16:21
@ lbolla Правильно, в конце концов я сделал это в своем коде.
 lbolla28 мая 2012 г., 12:48
Почему ты используешьapply в первую очередь? Ваш результат - новыйDataFrame с формой, отличной от входной (строки и столбцы), поэтому это совершенно новый объект. Вы могли бы просто иметьt_test_and_mean примите ваш входной фрейм данных (и столбцы для группировки) и верните фрейм данных 1-row-2-columns без использованияapply.

Ответы на вопрос(1)

а не кортежа, должно создать новый многостолбцовый DataFrame. Например

return pandas.Series({'pvalue': pvalue, 'mean_ratio': mean_ratio})
 Garrett21 мая 2014 г., 04:34
чтобы указать порядок столбцов, попробуйте построить серию со списками, а не с разделением, например:pandas.Series([pvalue, mean_ratio], index=['pvalue', 'mean_ratio'])
 mdurant26 мая 2015 г., 21:31
Это работает, но я не могу понять, почему при успешной передаче Series возвращается DataFrame, а при возврате DataFramne - нет ...
 foghorn13 апр. 2016 г., 23:14
Похоже, это работает, только если каждый столбец в «строке», возвращаемой как Серия, имеет один и тот же тип d! Ряд может содержать только 1 dtype в своем столбце.
 Einar26 мая 2012 г., 10:09
Я попытаюсь повторить в понедельник, но, если я правильно помню, он попытается привести к исходной структуре столбцов (таким образом, получая в итоге NA).
 ekta21 мая 2014 г., 03:37
@ garrett - Как я могу убедиться, что возвращенный из функции номер серии сохранит свой «предполагаемый» порядок. Мой пример использования - пост возвращение этой серии из функции, я сохраняю ее в CSV-файл, используя df.to_csv. Кроме того, что они глупы и называют их A, B, C, D, чтобы сохранить свой естественный порядок в файле CSV.

Ваш ответ на вопрос