2012-05-25 2 views
42

Я использую панды 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 с двумя столбцами, один для первого результата и один для второго. Возможно ли это, или я должен сделать два прогона для двух вычислений, а затем объединить их вместе?

+3

Почему вы используете 'apply' в первую очередь? Ваш результат - это новый 'DataFrame' с формой, отличной от ввода (обе строки и столбцы), поэтому это совершенно новый объект. Вы могли бы просто «t_test_and_mean» принять ваш входной фрейм (и столбцы для группировки) и вернуть 1-строчный 2-столбцовый фрейм, без использования 'apply'. – lbolla

+1

@ lbolla Правильно, в конце концов я закончил это в своем коде. – Einar

ответ

59

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

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

Я буду повторять попытку в понедельник, но если я правильно назову, он попытается заставить исходную структуру столбцов (таким образом, в конечном итоге с НС). – Einar

+0

@garrett - Как я могу убедиться, что серийный номер, возвращаемый функцией, сохранит свой «предназначенный» порядок. Мой случай использования is-post возвращает эту серию из функции, я сохраняю ее в csv-файле, используя df.to_csv. Кроме того, что он немыслим и называет их как A, B, C, D, чтобы сохранить естественный порядок в файле csv. – ekta

+4

, чтобы указать порядок столбцов, попробуйте построить серию со списками, а не dict, например: 'pandas.Series ([pvalue, mean_ratio], index = ['pvalue', 'mean_ratio'])' – Garrett

Смежные вопросы