この例のように、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 回実行してからマージする必要がありますか?