Используйте столбцы из одного DataFrame в качестве MultiIndex для t-теста в другом

1

Какова наилучшая практика использования столбцов из одного DataFrame в качестве индексов в другой MultiIndexed DataFrame с использованием Pandas для запуска t-теста?

Я видел пару других подобных вопросов, которые включали в себя цикл, который не кажется идеальным.

Например, я хотел бы запустить Стьюдента на группы, указанные в следующих inds против тех, кто не в inds в dat DataFrame.

import numpy as np
import pandas as pd
from scipy.stats import ttest_ind

np.random.seed(999)
dat = pd.DataFrame(data={"Group1" : np.random.randint(1, 3, 100),
                         "Group2" : np.random.randint(1, 5, 100),
                         "Value" : np.random.normal(size=100)})
dat.set_index(["Group1", "Group2"], inplace=True)

# How to use this as indices into MultiIndex of dat for t-test?
inds = pd.DataFrame(data={"Group1" : np.random.randint(1, 4, 20),
                          "Group2" : np.random.randint(2, 6, 20)})

# My attempt using joins, seems quite innefficient
inds["ind"] = True
inds.set_index(["Group1", "Group2"], inplace=True)

df = pd.merge(dat, inds, how='outer', left_index=True, right_index=True)
df['ind'].fillna(False, inplace=True)

# run test
tst = ttest_ind(df.loc[df['ind'], 'Value'],
                df.loc[~df['ind'], 'Value'], equal_var=False, nan_policy='omit')
Теги:
pandas
scipy
statistics

1 ответ

1
Лучший ответ

Как насчет index поиска, чтобы получить каждое подмножество для t-теста? Это может быть несколько более эффективным.

import numpy as np
import pandas as pd
from scipy.stats import ttest_ind

np.random.seed(999)
dat = pd.DataFrame(data={"Group1" : np.random.randint(1, 3, 100),
                         "Group2" : np.random.randint(1, 5, 100),
                         "Value" : np.random.normal(size=100)})
dat.set_index(["Group1", "Group2"], inplace=True)

# How to use this as indices into MultiIndex of dat for t-test?
inds = pd.DataFrame(data={"Group1" : np.random.randint(1, 4, 20),
                          "Group2" : np.random.randint(2, 6, 20)})

# Up to here the code is the same as yours (without inds["ind"] = True)
inds.set_index(["Group1", "Group2"], inplace=True)

# Only here is different (run test)
tst = ttest_ind(dat.loc[dat.index.isin(inds.index), 'Value'],
                dat.loc[~dat.index.isin(inds.index), 'Value'], equal_var=False, nan_policy='omit')

В качестве побочного примечания, если я правильно понимаю ваше намерение, вы хотите провести t-тест, используя всего 100 образцов. Чтобы достичь этого в вашем исходном коде, дублированные записи в результате "внешнего" merge должны быть удалены с помощью df.drop_duplicates().

Надеюсь это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню