熊猫数据框:按列子集+按另一列分组

Posted

技术标签:

【中文标题】熊猫数据框:按列子集+按另一列分组【英文标题】:pandas dataframe: subset by column + groupby another column 【发布时间】:2016-06-04 07:35:42 【问题描述】:

我是 pandas 数据框的新手,希望能帮助我解决以下问题(类似于 this)。我有以下数据:

data = 'Cat1': [2,1,2,1,2,1,2,1,1,1,2],
        'Cat2': [0,0,0,0,0,0,1,1,1,1,1],
        'values': [1,2,3,1,2,3,1,2,3,5,1]
my_data = DataFrame(data)

我想为Cat2 中的每个类别执行ttest_ind 以区分Cat1 中的类别。

在我看来,我可以将数据分成

cat1_1 = my_data[my_data['Cat1']==1]
cat1_2 = my_data[my_data['Cat1']==2]

然后循环遍历Cat2 中的每个值以执行 t 检验:

for cat2 in [0,1]:

    subset_1 = cat1_1[cat1_1['Cat2']==cat2]
    subset_2 = cat1_2[cat1_2['Cat2']==cat2]

    t, p = ttest_ind(subset_1['values'], subset_2['values'])

但这似乎真的很令人费解。有没有更简单的解决方案,也许是groupby?非常感谢!

【问题讨论】:

你可以尝试合并两个dfs @galaxyan 你能详细说明你的意思吗?谢谢! pandas.pydata.org/pandas-docs/stable/merging.html 可能会有帮助。 但是我已经有一个数据框了。我想我正在寻找很好地拆分数据的方法,而不是合并,对吧?但我很高兴听到您想到的解决方案! 【参考方案1】:

IIUC 你可以试试groupby by column Cat2 and apply function f:

import pandas as pd
from scipy.stats import ttest_ind

data = 'Cat1': [2,1,2,1,2,1,2,1,1,1,2],
        'Cat2': [0,0,0,0,0,0,1,1,1,1,1],
        'values': [1,2,3,1,2,3,1,2,3,5,1]
my_data =pd.DataFrame(data)
print my_data
    Cat1  Cat2  values
0      2     0       1
1      1     0       2
2      2     0       3
3      1     0       1
4      2     0       2
5      1     0       3
6      2     1       1
7      1     1       2
8      1     1       3
9      1     1       5
10     2     1       1

def f(x):
    #print x   
    cat1_1 = x[x['Cat1']==1]
    cat1_2 = x[x['Cat1']==2]

    t, p = ttest_ind(cat1_1['values'], cat1_2['values'])
    return pd.Series('a':t, 'b':p)     

print my_data.groupby('Cat2').apply(f) 
            a         b
Cat2                   
0     0.00000  1.000000
1     2.04939  0.132842  

【讨论】:

以上是关于熊猫数据框:按列子集+按另一列分组的主要内容,如果未能解决你的问题,请参考以下文章

如何按一列的最大值获取SQL行,按另一列分组

SQL Server:按分组列求和并按另一列排序

Python:如何按一列分组行并按另一列选择一行?

pandas/matplotlib 中一列按另一列分组的箱形图

按另一列值分组和计数

熊猫在一列上分组,另一列上的最大日期python