使用不同的布尔数组组合作为键,按结果分组

2024-04-27 04:32:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过使用布尔数组作为键来理解groupby,下面是测试代码

a = pd.DataFrame([[True,False,False],[False,True,False]], columns=['A','B','C'])
print(a)

     A      B      C
0   True  False  False
1  False   True  False

然后我尝试了不同的布尔数组组合,这似乎groupby结果都是相同的

b=a.groupby([False,False])
b.apply(pd.DataFrame)

       A     B       C
0   True    False   False
1   False   True    False

c=a.groupby([True,False])
c.apply(pd.DataFrame)

      A      B       C
0   True    False   False
1   False   True    False

d=a.groupby([False,True])
d.apply(pd.DataFrame)

     A       B       C
0   True    False   False
1   False   True    False

e=a.groupby([False,True])
e.apply(pd.DataFrame)

     A       B       C
0   True    False   False
1   False   True    False

Tags: columnsfalsetruedataframe数组pdapplyprint
2条回答

让我们把它分解一下

.groubpy().apply(pd.DataFrame)正如您在所有变体中使用的那样,从每个组中获取行并创建一个数据帧,该数据帧基本上返回self,因此输出看起来是一样的,但熊猫在每种情况下获取的方式都不同

  1. b=a.groupby([False,False]):两行属于同一组(组idFalse),并且一起解析一次以形成相同的df

  2. c=a.groupby([True,False]):有两个组,每个组有一行。Apply接受每个组并构建两个独立的数据帧(每个组一个)。然后连接并重新排列与原始df相同的df

  3. d=a.groupby([False,True]):与#2相同,但现在第一行属于False组。如果聚合或应用了不同的函数(pandas.DataFrame除外),您将看到以True, False作为索引的df(默认情况下,groupby排序),第1行将显示为第一行,因为它属于组True

这是因为您传递的分组参数无法将数据帧分割为所需的部分。因此,它只需复制整个数据帧,并将其“压缩”到正在传递的分组数组中。例如——

a = pd.DataFrame([[True,False,False],[False,True,False]], columns=['A','B','C'])

c = a.groupby([True,False])

print('length of grouper object:',len(c))
print(' ')
print(list(c)[0])
print(' ')
print(list(c)[1])
length of grouper object: 2
 
(False,        A     B      C
1  False  True  False)
 
(True,       A      B      C
0  True  False  False)

注意,使用分组数组[False,True],它只需将整个数据帧压缩到每个数组中。如果您通过了可以在轴1中找到的东西,那么它将考虑该系列中的项目来对数据集进行分组。p>

另一种方法是,分组参数需要是一个具有名称的序列,并且该名称应该在数据框的列中找到。如果您传递一个数组[True,False],它基本上被解释为一个无名序列,因此无法获取其键来进行拆分

如果您想了解groupby的工作原理,请遵循以下几点:

enter image description here

拆分发生在提供的键上,该键需要在索引/列中可引用,否则它无法拆分,只返回每个组的未拆分数据帧。第一步是石斑鱼要做的,下一步是简单的应用和组合步骤。在上面看到的元组(打印输出)中,apply函数对每个元组的t[1]元素进行操作,然后将其与每个元组的t[0]元素组合并垂直连接

相关问题 更多 >