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 数据框而不是打印它。
我工作流程中的主要工具之一是 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 数据框而不是打印它。