按类别过滤数据以在Python中进行统计测试

时间:2018-07-29 00:32:58

标签: python pandas loops

我正在使用一个数据框来用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等。我尝试将类别放入groupby,但是它不起作用。该函数仅接受两个参数。

更新: 我尝试了以下代码,但它将打印每个类别的全部数据 而且我也不认为它正确地通过了测试。这是我想做的。最终输出应为: 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))

2 个答案:

答案 0 :(得分: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 :(得分:0)

您的工作尝试应该会奏效。但是,您正在使用未知的 df3 。只需将groupby对象 sub_df 的迭代过程中的实际数据框替换为实际的数据框即可。实际上,可以扩展循环以从字典列表构建结果数据框。

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