从 pandas 返回多个值适用于 DataFrame

Posted

技术标签:

【中文标题】从 pandas 返回多个值适用于 DataFrame【英文标题】:Returning multiple values from pandas apply on a DataFrame 【发布时间】: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 对,我最终在我的代码中这样做了。 【参考方案1】:

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

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

【讨论】:

我将在星期一重试,但如果我没记错的话,它会尝试强制转换为原始列结构(因此以 NA 结尾)。 @garrett - 我如何确保从函数返回的序列将保留其“预期”顺序。我的用例是从一个函数返回这个系列,我使用 df.to_csv 将它保存到一个 csv 文件中。除了当然是愚蠢的,并将它们命名为 A、B、C、D 以保留其在 csv 文件中的自然顺序。 要指定列顺序,请尝试使用列表而不是字典来构建系列,例如:pandas.Series([pvalue, mean_ratio], index=['pvalue', 'mean_ratio']) 这行得通,但我不明白为什么传递一个系列成功返回一个 DataFrame,但传递一个 DataFramne 回不...... 这似乎只有在“行”中作为系列返回的每一列都具有相同的 dtype 时才有效!一个系列只能在其列中包含 1 个 dtype。

以上是关于从 pandas 返回多个值适用于 DataFrame的主要内容,如果未能解决你的问题,请参考以下文章

Python数据分析库pandas ------ pandas

是否有适用于 python 的 Anderson-Darling 实现返回 p 值?

将函数应用于 Pandas.DataFrame 中两列的每个组合的更好方法

用户定义的函数在sql中返回多个值

在 Pandas Dataframe 中查找多个字典键并返回多个匹配值

使用条件逻辑从 pandas df 创建多个列表