如何在 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
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