Я использую панды DataFrame
сделать по рядам Стьюдента, как в этом примере:Повторные несколько значений из панд применяются на DataFrame
import numpy
import pandas
df = pandas.DataFrame(numpy.log2(numpy.randn(1000, 4),
columns=["a", "b", "c", "d"])
df = df.dropna()
Теперь предположим, что у меня есть «а» и " b "как одна группа, а" c "и" d "- в другой, я выполняю t-критерий по ряду. Это довольно тривиально с пандами, используя apply
с осью = 1. Тем не менее, я могу либо вернуть DataFrame той же формы, если моя функция не агрегируется, или Series, если она агрегируется.
Обычно я просто выводил значение p (так, агрегация), но я хотел бы генерировать дополнительное значение на основе других вычислений (другими словами, вернуть два значения). Я могу, конечно, выполнить два прогона, сначала агрегируя значения p, а затем выполнив другую работу, но мне было интересно, есть ли более эффективный способ сделать это, поскольку данные достаточно велики.
В качестве примера расчета, hypotethical функция будет:
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 с двумя столбцами, один для первого результата и один для второго. Возможно ли это, или я должен сделать два прогона для двух вычислений, а затем объединить их вместе?
Почему вы используете 'apply' в первую очередь? Ваш результат - это новый 'DataFrame' с формой, отличной от ввода (обе строки и столбцы), поэтому это совершенно новый объект. Вы могли бы просто «t_test_and_mean» принять ваш входной фрейм (и столбцы для группировки) и вернуть 1-строчный 2-столбцовый фрейм, без использования 'apply'. – lbolla
@ lbolla Правильно, в конце концов я закончил это в своем коде. – Einar