如何在熊猫中做非均匀的群体?

时间:2015-02-09 10:06:30

标签: python 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的桶边界不同。

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 !!!

2 个答案:

答案 0 :(得分:0)

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

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

C
0.070313
0.381213
0.512383
0.634266
0.983505

由于这不相同,qcut会创建不同的存储分区,因此会得到不同的分组。

答案 1 :(得分:0)

这种丑陋的方法是通过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”的剪切的单独组。因此,C中的削减与A'

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

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