【发布时间】:2012-05-31 20:12:36
【问题描述】:
我正在使用 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 来说是相当简单的,使用轴 = 1 的apply。但是,如果我的函数没有聚合,我可以返回一个相同形状的 DataFrame,如果它聚合,我可以返回一个 Series。
通常我只会输出 p 值(因此,聚合),但我想根据其他计算生成一个附加值(换句话说,返回两个值)。我当然可以进行两次运行,首先聚合 p 值,然后进行其他工作,但我想知道是否有更有效的方法来执行此操作,因为数据相当大。
作为计算的一个例子,假设函数是:
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)
当然,在这种情况下,它返回一个带有两个元组作为值的系列。
相反,任何预期的输出将是一个包含两列的 DataFrame,一列用于第一个结果,另一列用于第二个结果。这是可能的还是我必须为这两个计算运行两次,然后将它们合并在一起?
【问题讨论】:
-
你为什么首先使用
apply?您的结果是一个新的DataFrame,其形状与输入(行和列)不同,因此它是一个全新的 obj。您可以让t_test_and_mean接受您的输入数据框(以及要分组的列)并返回一个 1-row-2-columns 数据框,而不使用apply。 -
@lbolla 对,我最终在我的代码中这样做了。