53

この例のように、PandasDataFrameを使用して行単位の t 検定を実行しています。

import numpy
import pandas

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

df = df.dropna()

ここで、"a" と "b" を 1 つのグループとして、"c" と "d" をもう 1 つのグループとして、t 検定を行ごとに実行します。applyこれは、軸 = 1を使用して、パンダではかなり簡単です。ただし、関数が集計されない場合は同じ形状の DataFrame を返すか、集計される場合は Series を返すことができます。

通常は p 値 (つまり集計) を出力するだけですが、他の計算に基づいて追加の値を生成したいと思います (つまり、2 つの値を返します)。もちろん、最初に p 値を集計してから他の作業を行うという 2 つの実行を行うこともできますが、データがかなり大きいため、より効率的な方法があるかどうか疑問に思っていました。

計算の例として、仮想関数は次のようになります。

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)

もちろん、この場合、2 つのタプルを値として持つ単一の Series を返します。

代わりに、予想される出力は、最初の結果用と 2 番目の結果用の 2 つの列を持つ DataFrame になります。これは可能ですか、それとも 2 つの計算を 2 回実行してからマージする必要がありますか?

4

1 に答える 1

95

タプルではなくシリーズを返すと、新しい複数列の DataFrame が生成されます。例えば、

return pandas.Series({'pvalue': pvalue, 'mean_ratio': mean_ratio})
于 2012-05-25T23:48:46.777 に答える