我正在使用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检验。使用带有轴= 1的apply
时,这对于pandas来说相当微不足道。但是,如果我的函数没有聚合,我可以返回相同形状的DataFrame,如果聚合则返回Series。
通常我只输出p值(所以,聚合)但我想基于其他计算生成一个额外的值(换句话说,返回两个值)。我当然可以进行两次运行,首先聚合p值,然后进行其他工作,但我想知道是否有更有效的方法可以做到这一点,因为数据相当大。
作为计算的一个例子,一个hypotethical函数将是:
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)
当然在这种情况下,它会返回一个以两个元组为值的系列。
相反,ny预期输出将是一个包含两列的DataFrame,一列用于第一个结果,另一列用于第二列。这是可能的还是我必须为两次计算做两次运行,然后将它们合并在一起?
答案 0 :(得分:70)
返回一个系列,而不是元组,应该生成一个新的多列DataFrame。例如,
return pandas.Series({'pvalue': pvalue, 'mean_ratio': mean_ratio})