从pandas返回多个值适用于DataFrame

Ein*_*nar 46 python pandas

DataFrame根据这个例子,我正在使用Pandas 进行逐行t检验:

import numpy
import pandas

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

df = df.dropna()
Run Code Online (Sandbox Code Playgroud)

现在,假设我将"a"和"b"作为一个组,而"c"和"d"作为另一个组,我正在逐行执行t检验.这对于pandas来说相当简单,使用applyaxis = 1.但是,如果我的函数没有聚合,我可以返回相同形状的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)
Run Code Online (Sandbox Code Playgroud)

然后调用

df.apply(t_test_and_mean, first=["a", "b"], second=["c", "d"], axis=1)
Run Code Online (Sandbox Code Playgroud)

当然,在这种情况下,它返回一个以两个元组为值的系列.

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

Gar*_*ett 75

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

return pandas.Series({'pvalue': pvalue, 'mean_ratio': mean_ratio})
Run Code Online (Sandbox Code Playgroud)

  • 这有效,但我无法理解为什么传递一个系列成功返回一个DataFrame,但传递一个DataFramne不... (5认同)
  • 要指定列顺序,请尝试使用列表而不是dict构造系列,例如:`pandas.Series([pvalue,mean_ratio],index = ['pvalue','mean_ratio'])` (4认同)
  • 这似乎只有在作为系列返回的“行”中的每一列都具有相同的 dtype 时才有效!一个系列的列中只能包含 1 个 dtype。 (4认同)