2 回答
TA贡献1995条经验 获得超2个赞
这是因为您传递的分组参数无法将数据帧切成所需的部分。所以它只是复制整个数据框并将其“压缩”到您传递的分组数组中。一个例子 -
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],它只是将整个数据帧 a 与每个压缩在一起。如果您改为传递它可以在轴 1 中找到的内容,它将考虑将该系列中的项目用于对数据集进行分组。
另一种看待它的方法是,分组参数需要是一个带有名称的系列,并且该名称应该在数据框的列中找到。如果你传递一个数组 [True, False],它基本上被解释为一个无名系列,因此无法获得它的键来进行拆分。
如果你想了解 groupby 的工作原理,下面是一个很好的图像 -
拆分发生在提供的键上,并且该键需要在索引/列中可引用,否则它无法拆分并简单地返回每个组的未拆分数据帧。第一步是石斑鱼所做的,接下来是应用和组合步骤,这些步骤很简单。在您上面看到的元组(打印输出)中,apply 函数对t[1]
每个元组的元素进行操作,然后将其与t[0]
每个元组的元素组合并垂直连接。
TA贡献1777条经验 获得超3个赞
让我们分解一下
.groubpy().apply(pd.DataFrame)
正如您在所有变体中使用的那样,从每个组中获取行并创建一个数据框,该数据框基本上返回self
,因此输出看起来相同,但 pandas 到达那里的方式在每种情况下都不同
b=a.groupby([False,False])
:两行属于同一个组(group_idFalse
),一起解析一次形成相同的dfc=a.groupby([True,False])
:有两组,每组一行。Apply 获取每个组并构建两个单独的 DataFrame(每个组一个)。然后连接并返回与原始相同的 dfd=a.groupby([False,True])
: 与 #2 相同,但现在第一行属于 groupFalse
。如果您聚合或应用了不同的函数(pandas.DataFrame 除外),您会看到 df 作为True, False
索引(默认情况下按 groupby 排序)并且第 1 行将显示为第一行,因为它属于组True
添加回答
举报