Python等效于do.call(rbind,lapply())

时间:2016-06-08 17:36:58

标签: python r pandas lapply

我的工作流程中的一个主要工具是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'] ,例如R:

for i in vars:
    getp(i)

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

这会创建一个很好的p值列。在现实世界中,我会提取一行data.frame,每列都有有用的模型统计数据。目标是迭代具有相同模型类型的许多列,并查看拟合/效果。

在python中,我可以创建一个类似的函数:

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

我可以通过以下方式将所有pvalue打印到控制台:

public class SomethingParameters
{
    public string A { get; set; }
    public int X { get; set; }
    public double D { get; set; }
    public bool DoIt { get; set; }
}

但是我想把它作为一个对象保存为一个列,其中三行类似于R.这可能吗?

谢谢!

实际功能可能如下所示:

public void DoSmtg(SomethingParameters parameters) { // method logic }

1 个答案:

答案 0 :(得分: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和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的定义以返回数据帧而不是打印它。