2016-06-08 2 views
3

Один из моих главных инструментов в моих рабочих процессов является do.call(rbind, lapply()), как exampled здесь в R:Python эквивалент do.call (rbind, lapply()) от R

df1 <- data.frame(x1 = rnorm(10), x2 = rnorm(10), x3 = rnorm(10)) 
df2 <- data.frame(x1 = rnorm(10, 5), x2 = rnorm(10), x3 = rnorm(10)) 

getp <- function(var) { 
    return(t.test(df1[, var], df2[, var])$p.value) 
} 

list <- c('x1', 'x2', 'x3') 
ps <- do.call(rbind, lapply(list, getp)) 
ps 
       [,1] 
[1,] 6.232025e-09 
[2,] 2.128019e-09 
[3,] 5.824713e-08 

Это создает хорошую колонку р- значения. В реальном мире я бы вытащил один ряд data.frame с каждым столбцом, имеющим полезную статистику модели. Цель состоит в том, чтобы перебирать множество столбцов с одним и тем же типом модели и видеть соответствие/эффекты.

В Python, я могу создать аналогичную функцию:

from statsmodels.stats.weightstats import ttest_ind 
import numpy as np 
import pandas as pd 

df1 = pd.DataFrame({'x1' : np.random.randn(10), 'x2' : np.random.randn(10), 'x3' : np.random.randn(10)}) 
df2 = pd.DataFrame({'x1' : np.random.randn(10)+5, 'x2' : np.random.randn(10)+5, 'x3' : np.random.randn(10)+5}) 
def getp(var): 
    print(ttest_ind(df1[var], df2[var])[1]) 

vars = ['x1', 'x2', 'x3'] 

Я могу печатать все pvalues ​​на консоль с помощью:

for i in vars: 
    getp(i) 

9.67944232638e-08 
1.82163637251e-08 
2.00410346438e-10 

Но я хотел бы сохранить это как объект как один столбец с тремя рядами, подобный R. Возможно ли это?

Спасибо!

Реальная функция может выглядеть следующим образом:

def getMoreThanP(var): 
    out = pd.DataFrame({'mean1' : [np.mean(df1[var])], 'mean2' : [np.mean(df2[var])], 'pvalue' : [ttest_ind(df1[var], df2[var])[1]]}) 
    print(out) 

for i in vars: 
    getMoreThanP(i) 

...  getMoreThanP(i) 
    mean1  mean2  pvalue 
0 0.24452 4.824327 2.438985e-11 
     mean1  mean2  pvalue 
0 0.187176 4.969862 1.115546e-11 
     mean1  mean2  pvalue 
0 0.035759 5.249378 1.525264e-08 

ответ

6

Вместо передачи переменных по одному, вы можете пройти все три:

ttest_ind(df1[vars], df2[vars])[1] 
Out[85]: array([ 4.97835813e-11, 8.30544748e-08, 9.24917262e-07]) 

Вернувшийся объектом является одномерным массивом , Если вы хотите получить информационную карту, то

pd.DataFrame(ttest_ind(df1[vars], df2[vars])[1]) 

Это главным образом потому, что ttest_ind принимает объекты типа массива. Для getMoreThanP, вы можете использовать комбинацию pd.concat и карты:

def getMoreThanP(var): 
    out = pd.DataFrame({'mean1' : [np.mean(df1[var])], 'mean2' : [np.mean(df2[var])], 'pvalue' : [ttest_ind(df1[var], df2[var])[1]]}) 
    return out 

pd.concat(map(getMoreThanP, vars)) 
# pd.concat(map(getMoreThanP, vars), ignore_index=True) if you want to reset index 
Out[134]: 
     mean1  mean2  pvalue 
0 -0.021791 4.964985 4.978358e-11 
0 0.087019 4.610332 8.305447e-08 
0 -0.084168 4.680124 9.249173e-07 

Обратите внимание, что я изменил определение getMoreThanP вернуть dataframe вместо его печати.

+0

Мой разум взорван, что ttest_ind принимает массив. Очень круто. Но я не уверен, что он решает мою полную проблему, поскольку то, что я действительно буду делать, - это желание собрать кучу вещей с каждой переданной переменной. Мой пост теперь обновлен, чтобы немного приблизиться к той функции, которую я могу написать. –

+0

Вы хотите напечатать значения или вернуть массив (матрица 3x3 в конце)? – ayhan

+0

Я хочу вернуть 3x3 'matrix' /' DataFrame'. С помощью метода loop я знаю, как видеть результат с помощью 'print()', поэтому я использую его здесь. Я предполагаю, что использую правильный метод. –

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