为了账号安全,请及时绑定邮箱和手机立即绑定

pandas groupby 结果使用布尔数组的不同组合作为键

pandas groupby 结果使用布尔数组的不同组合作为键

回首忆惘然 2023-06-06 10:37:55
我试图使用布尔数组作为键来理解 groupby,这是测试代码,a = pd.DataFrame([[True,False,False],[False,True,False]], columns=['A','B','C'])print(a)     A      B      C0   True  False  False1  False   True  False然后我尝试了布尔数组的不同组合,这似乎 groupby 结果都是相同的 rb=a.groupby([False,False])b.apply(pd.DataFrame)       A     B       C0   True    False   False1   False   True    Falsec=a.groupby([True,False])c.apply(pd.DataFrame)      A      B       C0   True    False   False1   False   True    Falsed=a.groupby([False,True])d.apply(pd.DataFrame)     A       B       C0   True    False   False1   False   True    Falsee=a.groupby([False,True])e.apply(pd.DataFrame)     A       B       C0   True    False   False1   False   True    False
查看完整描述

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 的工作原理,下面是一个很好的图像 -

//img1.sycdn.imooc.com//647e9c18000134e505800454.jpg

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



查看完整回答
反对 回复 2023-06-06
?
慕森王

TA贡献1777条经验 获得超3个赞

让我们分解一下

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

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

  2. c=a.groupby([True,False]):有两组,每组一行。Apply 获取每个组并构建两个单独的 DataFrame(每个组一个)。然后连接并返回与原始相同的 df

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


查看完整回答
反对 回复 2023-06-06
  • 2 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信