我正在使用一个数据框来用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))
答案 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