Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 自动识别数据帧中在某个值上没有显著差异的子组的过程_Python_Pandas_Numpy_Statistics - Fatal编程技术网

Python 自动识别数据帧中在某个值上没有显著差异的子组的过程

Python 自动识别数据帧中在某个值上没有显著差异的子组的过程,python,pandas,numpy,statistics,Python,Pandas,Numpy,Statistics,我有以下数据帧,为了这个例子,它充满了随机数: import numpy as np import pandas as pd from scipy.stats import ttest_ind df = pd.DataFrame(np.random.randint(0,1000,size=(100, 4)), columns=list('ABCD')) df['Category'] = np.random.randint(1, 3, df.shape[0]) df.head() A

我有以下数据帧,为了这个例子,它充满了随机数:

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

df = pd.DataFrame(np.random.randint(0,1000,size=(100, 4)), columns=list('ABCD'))
df['Category'] = np.random.randint(1, 3, df.shape[0])
df.head()

     A    B    C    D  Category
0  417   88  924  844         2
1  647  136   57  680         2
2  223  883  837   56         2
3  346   94   19   80         1
4  635  863  405   29         1
我需要找到n行(比如80行)的子集,这两个类别组(即类别1和类别2)之间的值“C”没有显著差异(p>0.05)

我进行以下t检验,以检验差异是否显著:

# t-test
cat1 = df[df['Category']==1]
cat2 = df[df['Category']==2]

ttest_ind(cat1['C'], cat2['D'])
输出:

Ttest_indResult(statistic=-2.004339328381308, pvalue=0.047793084338372295)

目前,我正在使用试错法手动执行此操作。我通过手动选择子集,测试它们,然后重新测试,直到找到所需的结果。我很想知道是否有一种方法可以自动化这个过程。

我的建议是,使用
itertools
中的
组合
,正如@rpanai与
groupby
pipe
正确建议的那样,使用它们可以在同一操作中获得不同的组。如果pvalue高于或低于阈值0.05,则返回一个布尔值,如果布尔值为True,则中断循环:

np.random.seed(123)
df = pd.DataFrame(np.random.randint(0,1000,size=(100, 4)), columns=list('ABCD'))
df['Category'] = np.random.randint(1, 3, df.shape[0])
df.head()

list_iter = [idx for idx in combinations(df.Category.unique(), 2)]
test = dict()

for i, j in list_iter:
    test[(i, j)] = df.groupby("Category").pipe(lambda g: ttest_ind(g["C"].get_group(i), 
                                               g["C"].get_group(j))[1] > 0.05)
    if test[(i, j)]:
        break
在此示例中,字典
test
为:

{(2, 1): True}
它适用于任意数量的组,例如,如果类别有三个组,
df['Category']=np.random.randint(1,4,df.shape[0])
,则测试的输出如下所示:

{(2, 3): True}
编辑:如果希望A的值用于成功的测试,可以执行以下操作:

list_iter = [idx for idx in combinations(df.Category.unique(), 2)]
test = dict()
for i, j in list_iter:
    test[(i, j)] = df.groupby("Category").pipe(lambda g: ttest_ind(g["C"].get_group(i),
                                                        g["C"].get_group(j))[1] > 0.05)
    if test[(i, j)]:
        output = df.loc[df["Category"].isin([i,j]), ["Category", "A"]]
        break
我将
D
替换为
C
,因为重读你的问题时,你说你想比较
C
类别
中的不同值。如果它不是
C
,而是
C
D
组合
将不会适用于您想要的所有组。 我还将布尔值改为大于0.05,因为您希望分组没有显著差异

下面是
测试的以下结果

{(2, 3): True}
对于
输出

   Category    A
0          2  510
1          3  988
2          2  595

对于
2
3
这两类
A
的值,其中
C
的值差异不显著。

您是否在寻找发生这种情况的第一个子集?@rpanai就这些目的而言,这并不重要。第一个很好,但如果不是第一个子集实例也没关系。您可以在循环中使用itertools.combines for df.index,直到您找不到满足条件的索引列表为止。我觉得很慢。谢谢你的全面回复。我的一个问题是,“[1]”在您提供的代码中表示什么(get_group(j))[1]<0.05?没问题:)这意味着我只将pvalue作为
scipy.stats.ttest_ind
返回统计数据和pvalue,但您只想将pvalue与阈值进行比较。感谢您提供的所有有用信息!我仍在努力找出如何检索与结果关联的原始值。那么,例如,在本文末尾,检索与最终组合关联的所有“A”值的最佳方法是什么?这看起来很棘手,因为一个groupby被雇佣来分类。@arkadiy我更正了上面的问题,以回答您的问题并匹配您想要的输出谢谢!!!!它像瑞士钟表一样工作。我真的很感谢你的帮助!