从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})