Python 相当于 do.call(rbind, lapply()) 来自 R

Python equivalent for do.call(rbind, lapply()) from R

我工作流程中的主要工具之一是 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

这创建了一个很好的 p 值列。在现实世界中,我会拉出一行 data.frame,每一列都有有用的模型统计信息。目标是迭代具有相同模型类型的许多列并查看 fit/effects.

在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

您可以传递所有三个变量,而不是一个一个地传递变量:

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

returning 对象是一维数组。如果你想要一个数据框

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

这主要是因为ttest_ind接受类数组对象。对于 getMoreThanP,您可以结合使用 pd.concat 和 map:

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 的定义更改为 return 数据框而不是打印它。