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