如何在 pandas 中进行非统一分组?

how to do non uniform groupby in pandas?

pd.groupby 适用于单列,但只要我按字段添加另一列,它就会给出不一致的结果。让我解释一下

如果我有一个包含三列的数据框,我想在其中使用 2 列(通过 qcut)进行分组。

df=pd.DataFrame({'A':np.random.rand(10),'B':np.random.rand(10),'C':np.rando
m.rand(10)})

示例输出

A   B   C
0   0.702505    0.078116    0.861276
1   0.474526    0.306926    0.373893
2   0.267395    0.441987    0.070313
3   0.934065    0.426689    0.782238
4   0.699563    0.245129    0.767107
5   0.399163    0.387137    0.381213
6   0.796172    0.950839    0.625333
7   0.121071    0.742237    0.512383
8   0.292286    0.537574    0.634266
9   0.314205    0.082177    0.983505


A               C              
(0.437, 0.934]  (0.512, 0.767]     0.597984
                (0.767, 0.984]     0.252402
                [0.0703, 0.512]    0.306926
[0.121, 0.437]  (0.512, 0.767]     0.537574
                (0.767, 0.984]     0.082177
                [0.0703, 0.512]    0.523787

在此处检查存储桶

如果我正常进行分桶,我会得到高于输出的结果

pd.groupby(df,by=[pd.qcut(df['A'],2),pd.qcut(df['C'],3)]).mean()

但是如果我尝试分两步进行分桶。首先是A桶,然后取A桶中的一组,得到C桶。这次C的bucket boundaries不一样了

data3=pd.groupby(df,pd.qcut(df['A'],2)).get_group('[0.121, 0.437]')
pd.groupby(data3,pd.qcut(data3['C'],3)).mean()



    A   B   C
C           
[0.0703, 0.425]     0.333279    0.414562    0.225763
(0.425, 0.594]  0.121071    0.742237    0.512383
(0.594, 0.984]  0.303246    0.309875    0.808885

为什么在 A 然后 C 中一个一个分组的第二个不匹配与一起做它们。这是错误还是功能?通常多分组应该以这种方式进行。首先取出满足谓词 'A' 的元素,然后使用这些组应用 'C' 分组。

好像是把两者都切平了。先C后B!!!

结果不同,因为您提供 groupby 函数不同的数据。

在第一种情况下,您在 df['C'] 中的所有值上创建存储桶,并与 df['A'] 的存储桶分组。但是,当您分两步进行分桶时,您将 qcut 应用于 data3 数据帧中 cloumn C 中的值子集,即:

C
0.070313
0.381213
0.512383
0.634266
0.983505

因为这不一样,qcut 创建不同的桶,因此你得到不同的分组。

丑陋的方法是通过 lambda 函数 考虑我的数据框

 df = pd.DataFrame({'a':np.random.randn(10),'b':np.random.randn(10),'c':np.random.randn(10)})   

 d1=pd.groupby(df,pd.qcut(df['a'],3)).agg(lambda x:   pd.groupby(df[df['a'].isin(x)],pd.qcut(df[df['a'].isin(x)]['c'],3)))

这将创建一个包含 'a' 个桶的键的数据框。这些值将根据 'c' 中的削减包含单独的组。所以 C 中的削减与 'A'

中的削减是分开的
print d1
print d1['a'][0].mean()
print d1['a'][1].mean()
Solutions
    a

一个

[-1.809, -0.403]  <pandas.core.groupby.DataFrameGroupBy object a...
(-0.403, -0.148]  <pandas.core.groupby.DataFrameGroupBy object a...
(-0.148, 0.466]   <pandas.core.groupby.DataFrameGroupBy object a...
                    a         b         c
c                                            
[-1.25, -1.117] -1.651242  0.699280 -1.183546
(-1.117, 0.256] -0.495549 -1.098577  0.255841
(0.256, 1.793]  -0.403244  0.307497  1.792965
                          a         b         c
c                                              
[-1.634, -0.951]  -0.222313  1.589451 -1.633914
(-0.951, -0.0707] -0.148088 -1.180386 -0.609345
(-0.0707, 1.0067] -0.274481  0.772706  1.006701