Фильтрация данных по категориям для статистического теста в Python

1

Я работаю с dataframe для проведения теста на Python.

Group    Count 
B        21 
B        13 
A        25 
A        75 
A        11 
B        15 

Пока это только для одного раздела или категории как такового, тест в порядке:

import pandas as pd
import scipy.stats as stats

valuespergroup = [col for col_name, col in df.groupby('Group')['Count']]
stats.ranksums(*valuespergroup)

Теперь рассмотрим следующее:

Category Group  Count
S1  P   21
S1  P   13
S1  A   25
S1  A   75
S1  A   10
S1  P   10
S2  P   21
S2  P   14
S2  A   29
S2  A   95
S2  A   15
S2  P   18

Мне нужно обработать по категориям, то есть сначала передать данные для S1, затем S2 и т.д. Я попытался поместить категорию в группу, но это не сработает. Функция принимает только два аргумента.

Обновления: я пробовал следующие коды, но он будет печатать целые данные для каждой категории, и я не думаю, что он был правильно передан в тест. Это по строкам, которые я хочу сделать. Конечный результат должен быть: Результаты теста S1 Результаты теста S2

groupby_Category = df.groupby('Category')

for  Category in groupby_Category:
     values_per_group = [col for col_name, col in df3.groupby(['Group'])['Count']]

     print(Category, stats.ranksums(*values_per_group))
  • 0
    Я пытался распространить это на случай с другой переменной, такой как категория. Сказать категорию2 безуспешно. Единственный способ, с помощью которого моя проверка работает, состоит в том, чтобы вручную установить подкадр данных для каждого значения категории, а затем применить функцию к сокращенным данным. Допустим, категория принимает значения (a, b, c) Пример. Сокращение = df [df ['category2'] == 'a']
Теги:
pandas
loops

2 ответа

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

Ваша рабочая попытка должна работать. Однако вы используете неизвестный df3. Просто замените это фактическим фреймворком данных из итерации объекта groupby, sub_df. Фактически, расширьте свой цикл, чтобы построить dataframe результатов из списка словарей.

groupby_Category = df.groupby('Category')

data_list = []

for i, sub_df in groupby_Category:
     values_per_group = [col for col_name, col in sub_df.groupby(['Group'])['Count']]

     res = stats.ranksums(*values_per_group)
     print(i, res)
     # S1 RanksumsResult(statistic=0.8728715609439696, pvalue=0.38273308888522595)
     # S2 RanksumsResult(statistic=1.091089451179962, pvalue=0.27523352407483426)

     data_list.append({'Category': i, 'statistic': res[0], 'p_value': res[1]})

ranksums_df = pd.DataFrame(data_list)
print(ranksums_df)
#   Category   p_value  statistic
# 0       S1  0.382733   0.872872
# 1       S2  0.275234   1.091089
  • 0
    Это круто. Теперь я ясно вижу, чего мне не хватало.
  • 0
    Большой! Рад помочь. Удачного кодирования!
Показать ещё 2 комментария
0

Похоже, вам нужна groupby 'Group','Category'

for x , y in df.groupby(['Group','Category'])['Count']:
    print(x,y)



('A', 'S1') 2    25
3    75
4    10
Name: Count, dtype: int64
('A', 'S2') 8     29
9     95
10    15
Name: Count, dtype: int64
('P', 'S1') 0    21
1    13
5    10
Name: Count, dtype: int64
('P', 'S2') 6     21
7     14
11    18
Name: Count, dtype: int64
  • 1
    Спасибо за вашу помощь. Меня не интересует печать каждой категории и ее элемента данных, а скорее прохождение всей категории для обработки тестом и возврата результата. Я попробовал это. Это не совсем правильно, но я делаю то, что хочу: groupby_Category = df.groupby ('Category') для категории в groupby_Category: values_per_group = [col для col_name, col в df3.groupby (['Group']) ['Count']] print (Category, stats.ranksums (* values_per_group))

Ещё вопросы

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