从pandas返回多个值适用于DataFrame

我使用一个Pandas DataFrame按照这个例子进行一个按行的t检验:

 import numpy import pandas df = pandas.DataFrame(numpy.log2(numpy.randn(1000, 4), columns=["a", "b", "c", "d"]) df = df.dropna() 

现在,假设我有一个“a”和“b”,另一个是“c”和“d”,我正在进行t检验。 对于pandas来说,这是相当平凡的,使用axis = 1的应用。 但是,如果我的函数没有聚合,我可以返回一个相同形状的DataFrame;如果聚合,我可以返回一个Series。

通常我只是输出p值(所以,聚合),但我想生成一个额外的价值基于其他计算(换句话说,返回两个值)。 我当然可以做两次运算,首先聚合p值,然后再做其他工作,但是我想知道是否有更高效的方法来处理,因为数据相当大。

作为计算的一个例子,一个低估的function是:

 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) 

当然,在这种情况下,它将返回一个单一的具有两个元组作为值的Series。

相反,ny预期输出将是一个DataFrame有两列,一个用于第一个结果,一个用于第二个。 这是可能的,或者我必须做两个运行两个计算,然后将它们合并在一起?

返回一个Series而不是元组,应该产生一个新的多列DataFrame。 例如,

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