Объединение результатов т-критерия в таблицу

Рассчитываю т-критерий методом scipy.stats.ttest_ind. Для каждого показателя (у меня их 7 по столбцам) у меня рассчитываются отличия для подвыборок мужчин и женщин. Я хочу это объединить в таблицу, чтоб оно выплевывалось не в куче или не отдельного для конкретно указанного показателя.

ttest = scipy.stats.ttest_ind(men, women)
itog = pd.DataFrame({"statistic":[ttest[0]],
                       "pvalue": [ttest[1]],
                       "значимость": ['True' if ttest[1] >= 0.05 else 'False']})

Но сталкиваюсь с ошибкой ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all(). Вероятно, мои результаты (на самом деле выплевываемые прямым подсчетом для датафрейма в виде

Ttest_indResult(statistic=array([ 0.05133366,  2.08921468,  0.53197364, -1.52560193,  3.60045126,
        1.62095854,  3.90005821]), pvalue=array([9.59113294e-01, 3.80132297e-02, 5.95362479e-01, 1.28763189e-01,
       4.04850724e-04, 1.06676229e-01, 1.33116661e-04]))

нужно "расшить", прежде чем компоновать в таблицу. Как мне обойти эту ошибку? Предпочитаемый итог, к которому стремлюсь, введите сюда описание изображения


Ответы (1 шт):

Автор решения: CrazyElf

Попробуйте так:

ttest = scipy.stats.ttest_ind(men, women)
itog = pd.DataFrame({"statistic": ttest[0],
                       "pvalue": ttest[1],
                       "значимость": ttest[1] >= 0.05})

Пояснение. Код ttest[1] >= 0.05 порождает Pandas.Series с булевским вектором значений, и когда вы пытаетесь его методами питона проверить через if Pandas.Series на истинность - возникает ошибка - питон не понимает, что ему делать с массивом булевых значений, истинно оно или ложно - непонятно. А вот Pandas прекрасно знает, как обработать Pandas.Series, чтобы сделать из него колонку в DataFrame - он возьмёт из него значения, а индекс отбросит.

Или можно сделать так, если вам так более понятно, и если вам нужны именно строковые True и False, а не булевские. Т.е. применить тернарный if нужно к каждому элементу массива:

"значимость": ['True' if t >= 0.05 else 'False' for t in ttest[1]]

P.S. Обратите внимание, что я ещё убрал квадратные скобки, в которые вы взяли значения первых двух колонок. У вас так получится, что все значения массива попадут в одну ячейку DataFrame-а.

→ Ссылка